AJAX के माध्यम से सर्वर पर PNG फ़ाइल अपलोड करने के लिए fileReader.readAsBinaryString का उपयोग करने की कोशिश कर रहा है, कोड को छीन लिया गया है (fileObject वस्तु है जो मेरी फ़ाइल पर जानकारी युक्त है);
var fileReader = new FileReader();
fileReader.onload = function(e) {
var xmlHttpRequest = new XMLHttpRequest();
//Some AJAX-y stuff - callbacks, handlers etc.
xmlHttpRequest.open("POST", '/pushfile', true);
var dashes = '--';
var boundary = 'aperturephotoupload';
var crlf = "\r\n";
//Post with the correct MIME type (If the OS can identify one)
if ( fileObject.type == '' ){
filetype = 'application/octet-stream';
} else {
filetype = fileObject.type;
}
//Build a HTTP request to post the file
var data = dashes + boundary + crlf + "Content-Disposition: form-data;" + "name=\"file\";" + "filename=\"" + unescape(encodeURIComponent(fileObject.name)) + "\"" + crlf + "Content-Type: " + filetype + crlf + crlf + e.target.result + crlf + dashes + boundary + dashes;
xmlHttpRequest.setRequestHeader("Content-Type", "multipart/form-data;boundary=" + boundary);
//Send the binary data
xmlHttpRequest.send(data);
}
fileReader.readAsBinaryString(fileObject);
अपलोड करने से पहले फ़ाइल की पहली कुछ पंक्तियों की जांच करना (VI का उपयोग करके) मुझे देता है
अपलोड दिखाने के बाद वही फ़ाइल
तो यह कहीं न कहीं एक प्रारूपण / एन्कोडिंग मुद्दे की तरह दिखता है, मैंने कच्चे बाइनरी डेटा पर एक साधारण UTF8 एनकोड फ़ंक्शन का उपयोग करने की कोशिश की
function utf8encode(string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
)
फिर मूल कोड में
//Build a HTTP request to post the file
var data = dashes + boundary + crlf + "Content-Disposition: form-data;" + "name=\"file\";" + "filename=\"" + unescape(encodeURIComponent(file.file.name)) + "\"" + crlf + "Content-Type: " + filetype + crlf + crlf + utf8encode(e.target.result) + crlf + dashes + boundary + dashes;
जो मुझे का उत्पादन देता है
अभी भी कच्ची फ़ाइल नहीं थी = (
एन्कोडिंग समस्याओं से बचने के लिए मैं फ़ाइल को कैसे एन्कोड / लोड / प्रोसेस करता हूं, इसलिए HTTP अनुरोध में प्राप्त की जा रही फ़ाइल अपलोड होने से पहले की फाइल की तरह ही है।
कुछ अन्य संभवतः उपयोगी जानकारी, अगर fileReader.readAsBinaryString () का उपयोग करने के बजाय मैं बाइनरी डेटा प्राप्त करने के लिए fileObject.getAsBinary () का उपयोग करता हूं, तो यह ठीक काम करता है। लेकिन getAsBinary फ़ायरफ़ॉक्स में ही काम करता है। मैं यह फ़ायरफ़ॉक्स और क्रोम में परीक्षण कर रहा हूँ, दोनों मैक पर, दोनों में समान परिणाम प्राप्त कर रहा है मैक पर फिर से चलने वाले एनजीआईएनएक्स अपलोड मॉड्यूल द्वारा बैकएंड अपलोड को संभाला जा रहा है । सर्वर और क्लाइंट एक ही मशीन पर हैं। यही बात किसी भी फाइल के साथ हो रही है जिसे मैं अपलोड करने की कोशिश करता हूं, मैंने सिर्फ पीएनजी को चुना क्योंकि यह सबसे स्पष्ट उदाहरण था।
<input type="file">
क्षेत्र का उपयोग करके अपलोड किया गया था )