2013-04-08 10 views
7

मुझे ऐसी समस्या मिली है जो SO पर कई बार बढ़ी है, लेकिन मुझे मेरा समाधान नहीं मिल रहा है! मैं ब्राउज़र में खोलने के बिना क्लाइंट को पीडीएफ फ़ाइल वितरित करने की कोशिश कर रहा हूं, फ़ाइल डाउनलोड करता है लेकिन जब मैं इसे खोलता हूं तो यह दूषित होता है और मूल फ़ाइल से कुछ बाइट गायब है। मैंने फ़ाइल डाउनलोड करने के लिए कई ऐसी विधियों का प्रयास किया है, लेकिन मैं आपको केवल नवीनतम दिखाऊंगा जो मैंने उपयोग किया है और उम्मीद है कि कुछ फीडबैक प्राप्त करें।फोर्स पीडीएफ फ़ाइल डाउनलोड करना, दूषित फ़ाइल

मैंने एक टेक्स्ट एडिटर में डाउनलोड पीडीएफ भी खोला है और इसके शीर्ष पर कोई PHP त्रुटि नहीं है जो मैं देख सकता हूं!

मुझे यह भी पता है कि readfile() बहुत तेज है लेकिन परीक्षण उद्देश्यों के लिए मैं कुछ भी काम करने के लिए बेताब हूं इसलिए मैंने थोड़ी देर (! Feof()) दृष्टिकोण का उपयोग किया!

वैसे भी पर्याप्त पर्यटन, यहाँ कोड (why my downloaded file is alwayes damaged or corrupted? से लिया गया):

$file  = __DIR__ . '/reports/somepdf.pdf'; 
$basename = basename($file); 
$length = sprintf("%u", filesize($file)); 

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="' . $basename . '"'); 
header('Content-Transfer-Encoding: binary'); 
header('Connection: Keep-Alive'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Content-Length: ' . $length); 

ob_clean(); 
set_time_limit(0); 
readfile($file); 

यह भी ध्यान रखें करने के लिए फ़ाइल आकार में अंतर नहीं था:

Original: 351,873 bytes 
Downloaded: 329,163 bytes 
+1

आप ('readfile का प्रयास किया था)'? – barbashov

+0

@ डेविडसी 7 9 9: यदि आप पिछले प्रश्नों के उत्तर पर चर्चा करना चाहते हैं, तो कृपया वहां एक टिप्पणी छोड़ दें। यहां कुछ कोड न छोड़ें और हमें बताएं "यह काम नहीं करता है"। ध्यान रखें, केवल किसी और ने उस उत्तर को स्वीकार कर लिया है, इसका मतलब यह नहीं होना चाहिए कि कोड भी आपके लिए काम करना चाहिए। और परीक्षण उद्देश्यों के लिए, कृपया समस्या को उत्तेजित करने के लिए न्यूनतम को कम से कम कोड को कम करें। जैसे कोई फंक्शन नहीं, बस एक हार्डकोडेड फ़ाइल नाम। Readfile का प्रयोग करें। – hakre

+0

@barbashov हाँ मैंने कई अलग-अलग तरीकों की कोशिश की है। – DavidC799

उत्तर

7

सुनिश्चित करें कि आप किसी भी संपीड़न नहीं चला रहे हैं आउटपुट बफरिंग हैंडलर, जैसे ob_gzhandler। मेरे पास एक समान मामला था और मुझे इसके लिए आउटपुट बफरिंग को ठीक से काम करने के लिए अक्षम करना पड़ा

+0

वास्तव में मैं वास्तव में हूँ! अब जब आप इसका जिक्र करते हैं तो मैंने किसी और पोस्ट में किसी और को उल्लेख किया है। कुछ चीजों को आजमाएंगे और आपको बताएंगे कि यह कैसा चल रहा है। परेशानी के लिए क्षमा कीजिए! – DavidC799

+0

सफलता! आपकी मदद के लिए बहुत धन्यवाद, हमेशा कुछ आसान :( – DavidC799

+0

@ डेविडसी 7 9 7: ठीक है, बस अन्य प्रश्नों को पढ़ें, वेबसाइट पर सबसे अधिक जवाब केवल आपको ही ढूंढने की जरूरत है;) – hakre

6

आप आउटपुट बफर पर ob_gzhandler का उपयोग कर रहे हैं।

यह आउटपुट के gzencoding भाग द्वारा काम करता है। आउटपुट फिर एन्कोडेड हिस्सों की एक धारा है।

प्रत्येक खंड को एन्कोडेड प्राप्त करने के लिए कुछ बाइट प्राप्त करने की आवश्यकता होती है, इसलिए पर्याप्त बाइट उपलब्ध होने तक आउटपुट थोड़ा सा बफर किया जाता है।

हालांकि आपकी स्क्रिप्ट के अंत में आप शेष बफर को फ्लश करने के बजाए छोड़ दें।

ob_clean() के बजाय ob_end_flush() का उपयोग करें और फ़ाइल पूरी तरह से दूषित हो जाती है और दूषित नहीं होती है।

ob_gzhandler के स्थानांतरण एन्कोडिंग का उपयोग करने के लिए आप फ़ाइल-अपलोड के साथ कोई समस्या नहीं रखते हैं जब आप आउटपुट-बफर को नष्ट नहीं करते हैं, इससे पहले कि यह काम कर सके।

यह वही है यदि कोई अन्य आउटपुट बफरिंग जो छिद्रित काम करता है, सक्षम होगा।

उदाहरण कोड:

$file  = __DIR__ . '/somepdf.pdf'; 
$basename = basename($file); 
$length = sprintf("%u", filesize($file)); 

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="' . $basename . '"'); 
header('Content-Transfer-Encoding: binary'); 
header('Connection: Keep-Alive'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Content-Length: ' . $length); 

ob_end_flush(); // <--- instead of ob_clean() 

set_time_limit(0); 
readfile($file); 

return; 

(FYI करें: वास्तव में भी ob_end_flush(); आवश्यक नहीं है, महत्वपूर्ण हिस्सा सिर्फ उत्पादन-बफर किक करने नहीं होने से पहले ही यह काम है किया जा सकता है है)

+0

मैं पुष्टि कर सकता हूं कि हैकर का कोड अपेक्षित काम करता है; विस्तृत स्पष्टीकरण – periklis

+0

के लिए धन्यवाद, मैंने अभी भी PHP में readfile() स्रोत की जांच की है और आपको प्रश्न में जैसे fopen/buffered पढ़ने के बजाय हमेशा इसका उपयोग करना चाहिए (यदि आप कर सकते हैं)। 'readfile()' फ़ाइल-डाउनलोड आउटपुट के लिए बहुत बेहतर है क्योंकि यह एसएपीआई में लाभ का उपयोग कर सकता है जो उपयोगकर्तालैंड कोड में संभव नहीं है। – hakre

-1

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

आप इसे उसी तरह मैंने किया था की स्थापना हो सकती है नहीं किया जा अप, लेकिन यह एक ही समस्या हो सकती है:

http://helpx.adobe.com/acrobat/kb/pdf-error-1015-11001-update.html

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