2013-03-22 10 views
5

में डेटा से मेल नहीं खाता है, मैं एचटीएमएल 5 फाइलरडर के माध्यम से वेब ब्राउजर में एक स्थानीय जेपीईजी फाइल का चयन करने की कोशिश कर रहा हूं, इसलिए मैं इसे पृष्ठ को पुनः लोड किए बिना सर्वर पर सबमिट कर सकता हूं। सभी मैकेनिक्स काम कर रहे हैं और मुझे लगता है कि जावास्क्रिप्ट ने मुझे सटीक डेटा स्थानांतरित कर रहा है और सहेज रहा है, लेकिन परिणाम सर्वर पर एक अवैध जेपीईजी फ़ाइल है।फ़ाइल रीडर से प्राप्त जेपीईजी डेटा फ़ाइल

<form name="add_photos"> 
    ​<input type=​"file" name=​"photo" id=​"photo" /><br /> 
    ​<input type=​"button" value=​"Upload" onclick=​"upload_photo()​;​" />​ 
</form> 

<script type="text/javascript"> 
    function upload_photo() { 
     file = document.add_photos.photo.files[0]; 
     if (file) { 
      fileReader = new FileReader(); 
      fileReader.onload = upload_photo_ready; 
      fileReader.readAsBinaryString(file); 
     } 
    } 

    function upload_photo_ready(event) { 
     data = event.target.result; 
     // alert(data); 

     URL = "submit.php"; 
     ajax = new XMLHttpRequest(); 
     ajax.open("POST", URL, 1); 
     ajax.setRequestHeader("Ajax-Request", "1"); 
     ajax.send(data); 
    } 
</script> 

तब मेरे PHP स्क्रिप्ट करता है:: यहाँ बुनियादी कोड है कि समस्या को दर्शाता है है अंतिम पंक्ति एक PHP त्रुटि फेंकता

$data = file_get_contents("php://input"); 
$filename = "test.jpg"; 
file_put_contents($filename, $data); 
$result = imagecreatefromjpeg($filename); 

कि "test.jpg मान्य JPEG फ़ाइल नहीं है।" यदि मैं अपने मैक पर डेटा वापस डाउनलोड करता हूं और इसे पूर्वावलोकन में खोलने का प्रयास करता हूं, तो पूर्वावलोकन कहता है कि फ़ाइल "क्षतिग्रस्त हो सकती है या फ़ाइल प्रारूप का उपयोग कर सकती है जो पूर्वावलोकन पहचान नहीं पाता है।"

यदि मैं अपने डेस्कटॉप पर मूल फ़ाइल और सर्वर पर अपलोड की गई फ़ाइल को टेक्स्ट एडिटर्स में अपनी सामग्री का निरीक्षण करने के लिए खोलता हूं, तो वे लगभग समान नहीं हैं। मूल फ़ाइल इस तरह शुरू होता है:

ˇÿˇ‡JFIFˇ˛;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 90 

लेकिन अपलोड की गई फ़ाइल इस तरह शुरू होता है: दिलचस्प बात यह है

ÿØÿàJFIFÿþ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 90 

, अगर मैं ऊपर टिप्पणी की बाहर लाइन के साथ एक जावास्क्रिप्ट चेतावनी में डेटा देख, ऐसा लगता है अपलोड की गई फ़ाइल के डेटा की तरह, ऐसा लगता है कि फ़ाइलरडर सर्वर पर डेटा स्थानांतरित या सहेजते समय पेश की गई किसी समस्या के विपरीत, शुरुआत में सही डेटा नहीं दे रहा है। क्या कोई इसे समझा सकता है?

मैं सफारी 6 का उपयोग कर रहा है और मैं भी फ़ायरफ़ॉक्स 14.

की कोशिश की अद्यतन: मैं बस पता लगा कि अगर मैं FileReader कोड छोड़ सकते हैं और (फाइल) (डेटा) ajax.send बदलने ajax.send को, छवि को सर्वर पर सही ढंग से स्थानांतरित और सहेजा जाता है। तो मेरी समस्या मूल रूप से हल हो गई है, लेकिन मैं उत्तर बिंदुओं को किसी को भी दूंगा जो बता सकता है कि readAsBinaryString के साथ मेरा मूल दृष्टिकोण क्यों काम नहीं करता है।

+2

'अलर्ट' बाइनरी डेटा प्रदर्शित करने के लिए डिज़ाइन नहीं किया गया है। और आप "टेक्स्ट एडिटर में फ़ाइल कैसे खोलें"? डिकोडिंग के लिए क्या एन्कोडिंग का उपयोग किया जाता है? –

+1

जेपीईजी फ़ाइल चश्मा के अनुसार पहले दो बाइट 0xFFE0 होना चाहिए। दो बाइट्स को स्पष्ट रूप से आपके ब्राउज़र और आपके टेक्स्ट एडिटर द्वारा अलग-अलग पाठ के रूप में व्याख्या किया जाता है। वे अलग-अलग एन्कोडिंग का उपयोग कर रहे हैं और विचलन के रूप में कहते हैं कि इस प्रकार का डेटा टेक्स्ट के रूप में उपयोग नहीं किया जाता है –

+0

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

उत्तर

4

आपकी समस्या readAsBinaryString के साथ निहित है। यह बाइनरी डेटा बाइट-फॉर-बाइट को स्ट्रिंग में स्थानांतरित कर देगा, ताकि आप अपनी PHP फ़ाइल में टेक्स्ट स्ट्रिंग भेज सकें। अब एक पाठ स्ट्रिंग में हमेशा एन्कोडिंग होती है; और जब आप स्ट्रिंग अपलोड करने के लिए XmlHttpRequest का उपयोग करते हैं, by default it will use UTF-8

इसलिए प्रत्येक चरित्र, जो मूल रूप से एक बाइट का प्रतिनिधित्व करने वाला था, को यूटीएफ -8 के रूप में एन्कोड किया जाएगा ... जो एकाधिक बाइट का उपयोग प्रत्येक चरित्र के लिए 127 से ऊपर कोड बिंदु के साथ करता है!

readAsBinaryString के बजाय readAsArrayBuffer का उपयोग करना सबसे अच्छा सबसे अच्छा है। यह सभी वर्ण सेट रूपांतरणों से बच जाएगा (जो आवश्यक हैं जब dealing with strings)।

+0

मुझे लगता है कि readAsArrayBuffer नाम मुझे डराता है इसलिए मैंने कभी कोशिश नहीं की। लेकिन आप सही हैं, मैं उसमें बदल गया और अब मेरा कोड पूरी तरह से काम करता है। स्पष्टीकरण भी सही समझ में आता है। – arlomedia

+1

@ आर्लोमिडिया: [कभी भी डरो मत] (http://goo.gl/Kqpkn) जटिल-ध्वनि विधियों के। Google आपका मित्र है, और आप सीखेंगे! ;-) – Martijn

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