Beim Versuch, mit fileReader.readAsBinaryString eine PNG-Datei über AJAX auf den Server hochzuladen, wurde der Code reduziert (fileObject ist das Objekt, das Informationen zu meiner Datei enthält).
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);
Das Untersuchen der ersten Zeilen einer Datei vor dem Hochladen (unter Verwendung von VI) gibt mir
Die gleiche Datei nach dem Hochladen wird angezeigt
Es sieht also nach einem Formatierungs- / Codierungsproblem aus. Ich habe versucht, eine einfache UTF8-Codierungsfunktion für die rohen Binärdaten zu verwenden
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;
)
Dann im Originalcode
//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;
das gibt mir die Ausgabe von
Immer noch nicht, was die Rohdatei war = (
Wie codiere / lade / verarbeite ich die Datei, um die Codierungsprobleme zu vermeiden, sodass die in der HTTP-Anforderung empfangene Datei mit der Datei vor dem Hochladen identisch ist.
Einige andere möglicherweise nützliche Informationen: Wenn ich anstelle von fileReader.readAsBinaryString () fileObject.getAsBinary () verwende, um die Binärdaten abzurufen, funktioniert dies einwandfrei. GetAsBinary funktioniert jedoch nur in Firefox. Ich habe dies in Firefox und Chrome getestet, beide auf Mac, und in beiden das gleiche Ergebnis erzielt. Die Backend-Uploads werden vom NGINX-Upload-Modul verarbeitet , das wiederum auf dem Mac ausgeführt wird. Der Server und der Client befinden sich auf demselben Computer. Das gleiche passiert mit jeder Datei, die ich hochladen möchte. Ich habe mich nur für PNG entschieden, weil dies das offensichtlichste Beispiel war.
<input type="file">
Feld hochgeladen worden wäre )