90 Stimmen

fileReader.readAsBinaryString zum Hochladen von Dateien

Versuchen Sie, fileReader.readAsBinaryString zu verwenden, um eine PNG-Datei auf den Server über AJAX hochzuladen, gestrippt unten Code (fileObject ist das Objekt mit Informationen über meine Datei);

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);

Die Prüfung der ersten Zeilen einer Datei vor dem Hochladen (mit VI) ergibt

enter image description here

Die gleiche Datei zeigt nach dem Hochladen

enter image description here

Es sieht also nach einem Formatierungs-/Kodierungsproblem aus. Ich habe versucht, eine einfache UTF8-Kodierungsfunktion für die binären Rohdaten 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 ursprünglichen Code

//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;

was mir die folgende Ausgabe liefert

enter image description here

Immer noch nicht, was die Rohdatei war =(

Wie kodiere/lade/verarbeite ich die Datei, um die Kodierungsprobleme zu vermeiden, so dass die in der HTTP-Anforderung empfangene Datei dieselbe ist wie die Datei vor dem Hochladen?

Einige andere möglicherweise nützliche Informationen, wenn statt mit fileReader.readAsBinaryString() ich fileObject.getAsBinary() verwenden, um die binären Daten zu erhalten, es funktioniert gut. Aber getAsBinary funktioniert nur in Firefox. Ich habe dies in Firefox und Chrome, beide auf Mac, getestet und in beiden das gleiche Ergebnis erhalten. Die Backend-Uploads werden von der NGINX Hochlade-Modul , ebenfalls auf Mac. Der Server und der Client befinden sich auf demselben Rechner. Das Gleiche passiert mit jeder Datei, die ich hochzuladen versuche. Ich habe PNG gewählt, weil es das offensichtlichste Beispiel ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X