PHP में प्रोग्रेस बार अपलोड करें


82

क्या किसी को पता है कि php में अपलोड के लिए प्रोग्रेस बार कैसे मिलता है? मैं एक फोटो एल्बम अपलोडर के लिए कोड लिखने की कोशिश कर रहा हूं। मैं एक प्रगति पट्टी प्रदर्शित करना चाहूंगा, जबकि तस्वीरें अपलोड हो रही हैं।

मैं php के लिए काफी नया हूँ इसलिए मुझे इसके बारे में सब कुछ पता नहीं है।


जवाबों:


70

यह अब तक है (गुग्लिंग के घंटों के बाद और स्क्रिप्ट की कोशिश करने के बाद) मुझे और सबसे अच्छे अपलोडर को स्थापित करने के लिए सबसे सरल है

https://github.com/FineUploader/fine-uploader

इसके लिए APC या किसी अन्य बाहरी PHP लाइब्रेरी की आवश्यकता नहीं है, मैं एक साझा होस्ट पर फ़ाइल प्रगति फीडबैक प्राप्त कर सकता हूं, और यह html5 ड्रैग एंड ड्रॉप (व्यक्तिगत रूप से अप्रयुक्त) और कई फ़ाइल अपलोड का समर्थन करने का दावा करता है।


11
इसके बजाय आप इसका उपयोग करना चाहते हैं, मेरा मानना ​​है: github.com/valums/file-uploader - समान लेखक।
माइकल रीड

6
और कृपया सेशन अपलोड प्रोग्रेस देखें जो कि एक फाइल अपलोड से बॉक्स के लिए प्रगति प्राप्त करने के लिए PHP प्रदान करता है।
हक्रे

7
@jpeskin डेवलपर के लिए अनुचित है। सिर्फ इसलिए कि आप "उन्हें भुगतान करने की पेशकश करते हैं" उन्हें आपके लिए काम करने के लिए किसी प्रकार की वेश्या की तरह नहीं समझाता है। यदि आप यह पता नहीं लगा सकते हैं कि इसे कैसे डीबग करना है, तो मैं खुद के अलावा किसी और पर उंगलियां चलाने नहीं जाऊंगा - आपके द्वारा इंटरनेट पर खोजा जाने वाला सॉफ़्टवेयर "जैसा है" वैसे ही लोगों को कोसने वाले के आसपास नहीं जाता है मदद करने की कोशिश करने से ज्यादा कुछ नहीं करना।
सुक्रैविकल

3
@sucitivel अधिक विस्तृत होने के लिए: मैंने भुगतान करने की पेशकश की और उसने स्वीकार कर लिया, फिर हम उस परेशानी के माध्यम से चले गए जो हम देख रहे सभी बगों को दस्तावेज करने के लिए गए थे, और फिर उसने किसी भी और सभी ईमेलों का जवाब देना बंद कर दिया (बस विनम्र, एक स्थिति अद्यतन का अनुरोध किया और क्या वह अभी भी काम में रुचि रखता था)। मैं किसी को पैसे के लिए काम करने के लिए बाध्य नहीं मानता। यह केवल उन लोगों के लिए एक अवलोकन डेटा बिंदु था जो डेवलपर की उपलब्धता और / या फ्रीलांस काम में रुचि के बारे में जानना चाहते हैं। परियोजना कांटे की थी, इसलिए मैं केवल एक ही समझदार व्यक्ति नहीं था जो देव को बनाए रखने में रुचि खो रहा था।
22

5
blueimp.github.com/jQuery-File-Upload - यह वास्तव में अच्छा काम करता है। कम से कम मुझे यह पसंद है क्योंकि यह उबंटू = के नीचे नहीं है।)
BeRocket

13

यदि आपके पास एपीसी स्थापित है, तो इसमें अपलोड प्रगति के लिए कॉलबैक हुक है।

रासमस लेरडोर्फ (PHP के निर्माता) के पास YUI (ओह, और यहाँ PHP स्रोत ) का उपयोग करके इसका एक नमूना है ।

यहां प्रलेखन देखें ।


न तो समान या php स्रोत लिंक अब और काम करते हैं .. क्या आपके पास कृपया एक लिंक है?
सुपरसन

@supersan यह उत्तर बहुत पुराना है। APC मर चुका है, और सत्र अपलोड API अब एक अलग चीज है। यह भी काम नहीं करता है अगर सर्वर FastCGI का उपयोग कर रहा है ... जो इन दिनों सुरक्षा कारणों से करते हैं।
पॉवरलॉर्ड

12

मुझे यह कहते हुए खेद है कि मेरे ज्ञान का सबसे अच्छा एक शुद्ध PHP अपलोड प्रगति बार, या यहां तक ​​कि PHP / जावास्क्रिप्ट अपलोड प्रगति पट्टी के कारण संभव नहीं है कि कैसे PHP काम करता है। आपका सबसे अच्छा शर्त यह है कि आप फ़्लैश अपलोडर के कुछ फॉर्म का उपयोग करें।

AFAIK इसका कारण यह है कि आपकी स्क्रिप्ट तब तक निष्पादित नहीं होती है जब तक कि सभी सुपरग्लोब पॉपुलेट नहीं किए जाते हैं, जिसमें $ _FILES शामिल है। जब तक आपकी PHP स्क्रिप्ट को कॉल किया जाता है, तब तक फ़ाइल पूरी तरह से अपलोड हो जाती है।

संपादित करें: यह अब सच नहीं है। यह 2010 में था।


13
तीन उतार क्यों? यह सच है और वे पूरी तरह से अनुचित हैं। मैं किसी को भी एक प्रगति पट्टी दिखाने की हिम्मत करता हूं जो देशी PHP पर चलता है, और काम करने के लिए अतिरिक्त एक्सटेंशन / अपाचे मॉड्यूल / पर्ल स्क्रिप्ट / अन्य सामान की आवश्यकता नहीं है।
पेकाका

1
खैर, यह 2011 है और यह HTML5 के लिए अब संभव है। पहली प्रतिक्रिया यहां देखें: stackoverflow.com/questions/76976/…
ज़ारेल

10
खैर, यह 2012 है, और XMLHttpRequest के माध्यम से HTML5 में फ़ाइल अपलोड अभी भी सभी प्रमुख ब्राउज़रों में उपलब्ध नहीं है।
डेमियन बी

3
@Pekka 웃 यह सच नहीं है। यदि आपके पास एपीसी स्थापित है (और आपको चाहिए) तो आप इसे पूरी तरह से PHP में कर सकते हैं, और कोई जावास्क्रिप्ट भी नहीं।
एरियल

2
@Pekka> PHP> = 5.4 में सत्र की जानकारी का उपयोग करते हुए अपलोड करने का उल्लेख नहीं है।
वूकी88

8

एक PHP-ish (5.2+) और नो-फ्लैश तरीका जिसने मेरे लिए अच्छी तरह से काम किया:

सबसे पहले, इस पोस्ट को देखें कि "अपलोडप्रोप्रोग्रेस" एक्सटेंशन को कैसे प्राप्त करें और चल रहा है।

फिर, उस पृष्ठ में, जिसमें आप फ़ाइल अपलोड कर रहे हैं, निम्नलिखित iframe बनाएं:

<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe>

अगला, इस कोड को अपने "सबमिट" बटन में जोड़ें:

onclick="function set() { f=document.getElementById('progress_iframe'); f.style.display='block'; f.src='uploadprogress.php?id=<?=$upload_id?>';} setTimeout(set);"

अब आपके पास अपने फॉर्म में एक छिपा हुआ iframe है जो दिखाई देगा और अपलोड करने की सामग्री दिखाएगा। जब आप फाइल अपलोड करना शुरू करने के लिए "सबमिट" पर क्लिक करेंगे। $ upload_id समान होना चाहिए जिसका उपयोग आप अपने फॉर्म में छिपे हुए फ़ील्ड "UPLOAD_IDENTIFIER" के मान के रूप में कर रहे हैं।

Uploadprogress.php खुद इस तरह दिखता है (अपनी आवश्यकताओं को ठीक करें और समायोजित करें):

<html>
<head>
<META HTTP-EQUIV='REFRESH' CONTENT='1;URL=?id=<?=$_GET['id']?>'>
</head>
<body>
Upload progress:<br />
<?php
    if(!$_GET['id']) die;
    $info = uploadprogress_get_info($_GET['id']);
    $kbytes_total = round($info['bytes_total'] / 1024);
    $kbytes_uploaded = round($info['bytes_uploaded'] / 1024);
    echo $kbytes_uploaded.'/'.$kbytes_total.' KB';
?>
</body>
</html>

ध्यान दें कि हर सेकंड सेल्फ रिफ्रेश होता है। यदि आप चाहें तो आप निश्चित रूप से यहां कुछ अच्छी दृश्य प्रगति पट्टी जोड़ सकते हैं (जैसे 2 नेस्टेड <div> s विभिन्न रंगों के साथ)। अपलोड प्रगति के साथ iframe स्वाभाविक रूप से केवल तभी काम करता है जब अपलोड प्रगति पर हो, और फ़ॉर्म सबमिट होने और अगले पृष्ठ पर ब्राउज़र पुनः लोड होने के बाद उसके दृश्यमान जीवन को समाप्त कर देता है।


आप php में $ _FILES के बिना फाइल कैसे अपलोड कर सकते हैं

4

अपलोड प्रगति पट्टी का कार्यान्वयन आसान है और इसके लिए किसी अतिरिक्त PHP एक्सटेंशन, जावास्क्रिप्ट या फ्लैश की आवश्यकता नहीं है। लेकिन आपको PHP 5.4 और नए की आवश्यकता है

आपको निर्देश session.upload_progress.enabledको Onइन पर सेट करके अपलोड प्रगति की जानकारी एकत्र करने में सक्षम करना है php.ini

फिर किसी अन्य फ़ाइल इनपुट से ठीक पहले HTML अपलोड फॉर्म में एक छिपा हुआ इनपुट जोड़ें । nameउस छिपे हुए इनपुट की एचटीएमएल विशेषता निर्देश के मूल्य session.upload_progress.nameसे php.ini(अंत में पूर्ववर्ती session.upload_progress.prefix) जैसी ही होनी चाहिए । valueविशेषता यह सत्र कुंजी के हिस्से के रूप में इस्तेमाल किया जाएगा, आप पर निर्भर है।

HTML फॉर्म इस तरह दिख सकता है:

<form action="upload.php" method="POST" enctype="multipart/form-data">
   <input type="hidden" name="<?php echo ini_get('session.upload_progress.prefix').ini_get('session.upload_progress.name'); ?>" value="myupload" />
   <input type="file" name="file1" />
   <input type="submit" />
</form>

जब आप यह फ़ॉर्म भेजते हैं, तो PHP को $_SESSIONसुपरग्लोबल संरचना में एक नई कुंजी बनानी चाहिए जो अपलोड स्थिति की जानकारी के साथ पॉपुलेटेड होगी। कुंजी संक्षिप्त nameऔर valueछिपी इनपुट की है।

PHP में आप पॉपुलेटेड अपलोड जानकारी पर एक नज़र डाल सकते हैं:

var_dump($_SESSION[
    ini_get('session.upload_progress.prefix')
   .ini_get('session.upload_progress.name')
   .'_myupload'
]);

आउटपुट निम्न के समान दिखाई देगा:

$_SESSION["upload_progress_myupload"] = array(
  "start_time" => 1234567890,   // The request time
  "content_length" => 57343257, // POST content length
  "bytes_processed" => 54321,   // Amount of bytes received and processed
  "done" => false,              // true when the POST handler has finished, successfully or not
  "files" => array(
    0 => array(
      "field_name" => "file1",    // Name of the <input /> field
      // The following 3 elements equals those in $_FILES
      "name" => "filename.ext",
      "tmp_name" => "/tmp/phpxxxxxx",
      "error" => 0,
      "done" => false,            // True when the POST handler has finished handling this file
      "start_time" => 1234567890, // When this file has started to be processed
      "bytes_processed" => 54321, // Number of bytes received and processed for this file
    )
  )
);

प्रगति बार बनाने के लिए आवश्यक सभी जानकारी है - आपके पास जानकारी है यदि अपलोड अभी भी प्रगति पर है, तो कुल कितनी बाइट हस्तांतरित होने जा रही हैं और कितने बाइट पहले ही हस्तांतरित हो चुकी हैं।

उपयोगकर्ता को अपलोड प्रगति प्रस्तुत करने के लिए, अपलोड करने की तुलना में एक और PHP स्क्रिप्ट लिखें, जो केवल सत्र में अपलोड जानकारी को देखेगा और उदाहरण के लिए, इसे JSON प्रारूप में वापस कर देगा। इस स्क्रिप्ट को समय-समय पर कहा जा सकता है, उदाहरण के लिए हर सेकंड, AJAX और उपयोगकर्ता को प्रस्तुत जानकारी का उपयोग करके।

तुम भी निर्धारित करके अपलोड रद्द करने में सक्षम हैं $_SESSION[$key]['cancel_upload']करने के लिए true

विस्तृत जानकारी के लिए, अतिरिक्त सेटिंग्स और उपयोगकर्ता की टिप्पणियां PHP मैनुअल देखती हैं ।


2

एक और अपलोडर पूर्ण JS: http://developers.sirika.com/mfu/

  • इसका नि: शुल्क (बीएसडी लाइसेंस)
  • Internationalizable
  • पार ब्राउज़र आज्ञाकारी
  • आपके पास APC स्थापित करने या न करने का विकल्प है (प्रगति बार को रद्द करें VS VS प्रगति बार को निर्धारित करें)
  • अनुकूलन लुक के रूप में यह डोजो टेम्पलेट तंत्र का उपयोग करता है। आप अपने सीएसएस के अनुसार अपने टेम्प्लेट्स को टी टेम्प्लेट में जोड़ सकते हैं

मज़े करो


2

एचटीएमएल 5 एक की शुरुआत की फ़ाइल अपलोड API कि आप फ़ाइल अपलोड की प्रगति की निगरानी करने की अनुमति देता है, लेकिन पुराने ब्राउज़र के लिए वहाँ plupload एक रूपरेखा है कि विशेष रूप से नजर रखने के फ़ाइल अपलोड और उनके बारे में दे जानकारी में किए गए। साथ ही इसमें बहुत सारे कॉलबैक हैं इसलिए यह सभी ब्राउज़रों में काम कर सकता है


2

HttpRequestAJAX के माध्यम से फ़ाइल अपलोड सबमिट करने के लिए Gears और HTML5 के पास ऑब्जेक्ट में एक प्रगति घटना है ।

http://developer.mozilla.org/en/Using_files_from_web_applications

आपके अन्य विकल्प जो पहले से ही दूसरों द्वारा उत्तर दिए गए हैं:

  1. फ्लैश आधारित अपलोडर।
  2. जावा आधारित अपलोडर।
  3. वेब सर्वर या एक स्क्रिप्ट के लिए दूसरा धूमकेतु-शैली का अनुरोध प्राप्त आंकड़ों के आकार की रिपोर्ट करने के लिए। लाइटबैप जैसे कुछ वेबसर्वर्स किसी बाहरी स्क्रिप्ट या प्रक्रिया को कॉल करने के ओवरहेड को बचाने के लिए इस प्रक्रिया को करने के लिए मॉड्यूल प्रदान करते हैं।

तकनीकी रूप से एक अगला विकल्प है, YouTube अपलोड के समान, गियर्स या एचटीएमएल 5 के साथ आप एक फ़ाइल को छोटे चंक्स में विभाजित करने के लिए ब्लॉब्स का उपयोग कर सकते हैं और व्यक्तिगत रूप से प्रत्येक चंक को अपलोड कर सकते हैं। प्रत्येक हिस्सा पूरा होने पर आप प्रगति की स्थिति को अपडेट कर सकते हैं।


1

प्रगति पट्टी बनाने के लिए आपको जावास्क्रिप्ट का उपयोग करना होगा। Google की एक साधारण खोज ने मुझे इस लेख की ओर अग्रसर किया: WebAppers Simple Javascript Progress Bar with CSS

Dojo फ़ाइल अपलोड प्रगति पट्टी विजेट Dojo जावास्क्रिप्ट फ्रेमवर्क का उपयोग कर एक और विकल्प है।

संपादित करें: बड़ी संख्या में छवियों को अपलोड करना (जैसे कि एक फोटो एल्बम), और उन्हें अपनी PHP स्क्रिप्ट में पोस्ट करना, आप पोस्ट से परिणाम वापस पढ़ने और अपलोड की गई छवियों की संख्या के आधार पर प्रगति बार को अपडेट करने के लिए जावास्क्रिप्ट का उपयोग कर सकते हैं। / छवियों की कुल संख्या। यह प्रत्येक पोस्ट के पूरा होने के बाद केवल अपडेट करने का दुष्प्रभाव है। जेएस के साथ पोस्ट करने के बारे में कुछ जानकारी के लिए यहां देखें ।


6
-1 जावास्क्रिप्ट प्रगति बार अच्छा है, लेकिन फ़ाइल अपलोड से कोई लेना-देना नहीं है जहाँ तक मैं देख सकता हूँ। और Dojo अपलोड प्रगति बार PHP के लिए कोई इंटरफ़ेस प्रदान नहीं कर रहा है। मुझे सुधारें अगर मैं निश्चित रूप से गलत हूं।
पेकाका

1

एक php / ajax प्रोग्रेस बार किया जा सकता है। (नाशपाती में Html_Ajax पुस्तकालय की जाँच करें)। हालाँकि इसके लिए कस्टम मॉड्यूल को php में स्थापित करने की आवश्यकता होती है।

अन्य विधियों में एक iframe का उपयोग करने की आवश्यकता होती है, जिसके माध्यम से php यह देखने के लिए देखता है कि फ़ाइल को कितना अपलोड किया गया है। हालाँकि इस छिपे हुए iframe को कुछ ब्राउज़रों के ऐडऑन द्वारा ब्लॉक किया जा सकता है क्योंकि छिपे हुए iframes का उपयोग अक्सर किसी उपयोगकर्ता के कंप्यूटर में दुर्भावनापूर्ण डेटा भेजने के लिए किया जाता है।

यदि आप अपने सर्वर पर नियंत्रण नहीं रखते हैं तो आपका सबसे अच्छा शर्त यह है कि आप फ्लैश प्रगति बार के कुछ रूप का उपयोग करें।


कुछ ऐड-ऑन iframes को ब्लॉक कर सकते हैं, लेकिन ब्राउज़र? क्या आप एक उदाहरण दे सकते हैं?
यंहा

"Ajax php फ़ाइल अपलोड" की शर्तों को टॉगल करते हुए, शीर्ष 5 के 4 परिणाम लौटाते हैं यदि सभी iframes का उपयोग करते हैं (यह निश्चित नहीं है कि यदि 5 वां पेज लोड नहीं होगा)। प्रत्येक साइट पर उदाहरण देखें।
अली लोन

वास्तव में, वे iframes का उपयोग करते हैं, लेकिन यह उल्लेख नहीं करते कि इसे किसी भी मामले में अवरुद्ध किया जा सकता है। या मुझे याद किया है?

क्षमा करें, गलत तरीके से जो आप पूछना चाह रहे थे, नहीं, मैं उन ब्राउज़रों का कोई उदाहरण नहीं दे सकता, जो सीधे आईफ्रेम को ब्लॉक करते हैं, मैं उन एडोन्स के बारे में सोच रहा था, जो लोग उनके साथ उपयोग करते हैं जैसे कि नोस्क्रिप्ट जो इफ्रेम को ब्लॉक करता है। भविष्य के संदर्भ के लिए पोस्ट में अद्यतन पाठ।
अली लोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.