2009-10-13 18 views
7

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

मैं php मैनुअल से इस कोड के कुछ try'd है, लेकिन यह मेरे लिए ज्यादा कुछ नहीं है। adv में

Header ("Content-Type: application/octet-stream"); 
Header ("Content-Length: ".filesize($file)); 
Header("Content-Disposition: attachment; filename=$filename"); 

// buffered read not using readfile($file); 

if ($fp = fopen($bestand, 'rb')) { 
    while (!feof($fp)) { 
     $buf = fread($fp, 4096); 
     echo $buf; 
     $bytesSent += strlen($buf); /* We know how many bytes were sent to the user */ 
    }  
} 

if ($bytesSent == filesize($fp)) { 
    //do something with db 
} 

धन्यवाद, रिचर्ड

+0

im पाया एक अच्छा समाधान शुद्ध पीएचपी कार्यान्वित: http://bytes.com/topic/php/answers/551302-how-detect-if-file-download-completed- रद्द – StefanoCudini

उत्तर

9

यह वास्तव में आपको यह बताने वाला नहीं है कि डाउनलोड उपयोगकर्ता के लिए पूरा हो गया है या नहीं। यह आपको बताएगा कि आप उपयोगकर्ता को बाइट भेजना समाप्त कर चुके हैं, लेकिन यह कुछ भी नहीं कहता है कि उपयोगकर्ता ने वास्तव में कितने प्राप्त किए हैं।

वास्तविकता में, पीएचपी (जो एक सर्वर साइड, नहीं एक क्लाइंट-साइड है, भाषा) के साथ कोई रास्ता सही मायने में पता लगाने के लिए जब एक फाइल डाउनलोड पूर्ण हो गया है। सबसे अच्छा आप कर सकते हैं जब यह शुरू होता है तो अपने डेटाबेस में डाउनलोड लॉग इन करें। यदि आप पूरी तरह से, पूरी तरह से और पूरी तरह से यह जानना चाहते हैं कि डाउनलोड कब पूरा हो गया है, तो आपको जावा एप्लेट एम्बेड करने या फ्लैश का उपयोग करने जैसी कुछ करना होगा। हालांकि, आमतौर पर यह आपके उपयोगकर्ता के लिए उपयोगिता के मामले में सही उत्तर नहीं है (क्यों उन्हें जावा या फ्लैश स्थापित करने की आवश्यकता है बस आपसे कुछ डाउनलोड करने के लिए?)।

+0

हां, मैंने इसे लागू किया है, और कुछ भी गलत होने पर मुझसे संपर्क करने के लिए एक रिटर्न संदेश दिया। जब मैंने पूरा किया तो कॉलबैक प्राप्त करने के लिए मैंने एक jquery प्लगइन का भी उपयोग किया और मेरे पास कोई पेज रीफ्रेश नहीं है। – Richard

+0

http://php.net/function.ignore_user_abort - http://www.php.net/connection_aborted – hakre

+0

@hakre doc से कनेक्शन_बॉर्टेड के लिए: जब कमांड लाइन स्क्रिप्ट केवल (tty) के रूप में PHP चलाते हैं। – Mike

1

मैं यह जानना है कि कितने काटने बाहर भेजा दिया गया है (और वास्तव में डाउनलोड ग्राहक के माध्यम से), वहाँ कोई रास्ता नहीं है, तो पता करने के लिए है, क्योंकि php के माध्यम से संभव है नहीं लगता है उपयोगकर्ता ने डाउनलोड रद्द कर दिया है या पूरी फाइल प्राप्त की है।

+0

और वेबसर्वर के बीच में है। PHP पर इसका नियंत्रण नहीं है। – powtac

+1

उपयोगकर्ता के अंत में भी प्रॉक्सी डाउनलोड को पूरा कर सकता है भले ही उपयोगकर्ता ने इसे रद्द कर दिया हो –

+0

धन्यवाद, जीनिबलर। फिर यह सब कहता है। यह एक विश्वसनीय तरीका नहीं है। – Richard

2

के रूप में मार्क डब्ल्यू के पहले ही बताया php केवल आप बता सकते हैं कि तुम क्या सर्वर से भेज दिया है, क्या ग्राहक की, नहीं मिला तो सख्ती से php का उपयोग कर एक गैर स्टार्टर है।

लेकिन उपयोगकर्ता को एक बटन दबाकर डाउनलोड की पुष्टि करने की संभावना हमेशा होती है जो एक एमडी 5 हैश उत्पन्न करके जेएस चेक को कॉल करता है और इसकी तुलना आपके सर्वर पर फ़ाइल के एमडी 5 हैश से करता है (ऑन-सर्वर एमडी 5 आपके द्वारा उत्पन्न किया जा रहा है), और एक सफल तुलना में जेएस स्क्रिप्ट का उपयोग अपने डीबी को अपडेट करने के लिए करें या इसे करने के लिए php-script को कॉल करने के लिए इसका उपयोग करें। अगर वे हिट "हाँ, यह ठीक है" तो डेटाबेस को अद्यतन

तुम हमेशा सिर्फ उन्हें डाउनलोड की जाँच करने के पूछ सकते हैं, वे क्या उम्मीद है और।


संपादित: ओपी की टिप्पणी के जवाब में।

धन्यवाद, लेकिन आप उपयोगकर्ताओं की सहकारीता पर निर्भर नहीं हो सकते हैं। क्योंकि उन्हें डाउनलोड के लिए भी भुगतान करना पड़ता है, यह बेहतर है कि मेरे पास सभी नियंत्रण हैं। मुझे लगता है कि जब स्क्रिप्ट का उपयोग किया जाता है तो मैं डेटाबेस को अपडेट कर दूंगा। ऐसा तब सबसे विश्वसनीय लगता है।

कैसे इसकी अखंडता की पुष्टि करने और अपने डाटाबेस के लिए एक अद्यतन चल आरंभ -और डाउनलोड maintain- को एक अजाक्स नियंत्रण का उपयोग, और पूरा होने पर, के बारे में?

मैं स्वचालित रूप से अपने ग्राहकों को,, आप बंद चीर करने जा रहे हैं, हालांकि जो कुछ भी आप को चुनने के अंत संभालने नहीं सुझाव देना चाहेंगे। उन्हें अच्छी तरह से पूछना 'क्या यह आपके लिए काम करता है?' और, यदि नहीं, तो आपके लिए और उनके लिए एक बग-रिपोर्ट उपयोगी हो सकती है।

लेकिन, परवाह किए बिना, अपने उपयोगकर्ताओं की कुछ लोग कह सकते हैं, जबकि 'नहीं' सिर्फ अतिरिक्त प्रतिलिपि आप अपने काम का बोझ बढ़ गई अपनी हो रहा है को रोकने के लिए की लागत के खिलाफ है कि की लागत को संतुलित करने के लिए। यदि 'ईमानदारी' बनाए रखने की लागत अतिरिक्त प्रतिलिपि लेने की संभावित/संभावित लागत से अधिक है, तो वहां थोड़ा सा बिंदु है।

+0

धन्यवाद, लेकिन आप उपयोगकर्ताओं की सहकारीता पर निर्भर नहीं हो सकते हैं। क्योंकि उन्हें डाउनलोड के लिए भी भुगतान करना पड़ता है, यह बेहतर है कि मेरे पास सभी नियंत्रण हैं। मुझे लगता है कि जब स्क्रिप्ट का उपयोग किया जाता है तो मैं डेटाबेस को अपडेट कर दूंगा। ऐसा तब सबसे विश्वसनीय लगता है। – Richard

+0

आपके अतिरिक्त इनपुट के लिए धन्यवाद, लेकिन आप इस तथ्य से भाग गए कि आपने उल्लेख किया है कि एक अजाक्स तरीका है। क्या आपके पास इसका उदाहरण है? – Richard

+0

दुर्भाग्य से, मैं नहीं करता हूं। मैं जेएस/jQuery/अजाक्स को समाधान देने के लिए पर्याप्त रूप से नहीं जानता। अजाक्स, जेएस और/या jQuery समाधानों के लिए अनुरोध - और फिर से टैग करने के लिए अपने मूल प्रश्न को संपादित करने के लायक हो सकता है। मुझे खेद है कि मैं इसमें आपके लिए अधिक उपयोग नहीं कर सकता। –

-4

निम्नलिखित कोड काम करता है।यदि क्लाइंट द्वारा डाउनलोड बंद कर दिया गया है, तो डेटाबेस अपडेट नहीं किया गया है और लिंक फिर से आग लग सकता है।

$file='pathto.zip'; 

    header("Content-type: application/zip"); 
    header("Content-Disposition: attachment; filename=$file"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    readfile("$file"); 

    $sql = "UPDATE YOUR TABLE"; 

    exit; 
+0

यह काम नहीं करता है। 'readfile' यह नहीं बता सकता कि उपयोगकर्ता ने रद्द कर दिया है या नहीं। यह बिना किसी त्रुटि के लौटाता है, यह मानते हुए कि फ़ाइल आउटपुट बफर में फिट होने के लिए पर्याप्त छोटा है, और फिर कोड डेटाबेस अपडेट तक पहुंच जाता है। पाइप के दूसरी तरफ डिलीवरी इंगित करने के लिए टीसीपी परत से ऊपर कुछ भी प्रचारित नहीं किया जाता है। –

+0

यह इस तरह काम नहीं करता है। – Mike

+0

यह अब और काम नहीं करता है। –

0

वहाँ एक समाधान अगर आप (सर्वर साइड कॉल के लिए) php एक जावास्क्रिप्ट (ग्राहक पूरा कॉल के लिए) मिश्रण कर रहे हैं।

देखो कैसे Detect when browser receives file download

मैं यकीन है कि आप इस तरह से एक अच्छा परिणाम हो सकता है कर रहा हूँ पर यह जवाब। मुझे आशा है कि इस मदद दूसरों, माइक

संबंधित मुद्दे