it-swarm.com.de

Eingabe der Dateieingabe als FileReader-Binärdaten durch AJAX Post

Ich versuche, einen in eine HTML-Dateieingabe hochgeladenen Anhang über eine Rest-API auf einer Webseite zu posten. In der API-Dokumentation wird angegeben, dass der Beitrag ein direkter binärer Inhalt als Hauptteil der HTTP-Anforderung ist und kein Formulardatei-Upload.

Mein Code lautet wie folgt:

$('#_testButton').bind('click', function () {
    var file = document.getElementById('_testFile').files[0]
    var reader = new FileReader();
    reader.onload = function () {
        $.ajax({
            url: '/attachmentURL',
            type: 'POST',
            data: reader.result
        })
    }
    reader.readAsBinaryString(file)
})

Ich brauche dies, um für eine Reihe verschiedener mimeTypes zu arbeiten, also habe ich es im obigen Code nicht deklariert. Ich habe jedoch versucht, contentType: 'application/msword' für eine .doc-Datei zu deklarieren und auch processData: false und contentType: false.

Die Daten werden dort veröffentlicht, wo sie sollen. Wenn ich jedoch die Datei öffne, erhalte ich eine Meldung mit der Aufschrift mimeType: application/x-empty mit leerer Datei OR eine Datei mit mehreren Binärzeichen. Ich habe DOC-Dateien und PDF-Dateien ausprobiert und das Ergebnis ist für beide gleich.

Hat jemand eine Ahnung, was ich ändern kann, um diese Arbeit zu machen?

25
Eric H.

Das Senden der file-Referenz als Daten (mit processData: false) hat die Aufgabe für mich zumindest erfüllt:

$('#_testButton').bind('click', function () {
    var file = document.getElementById('_testFile').files[0];

    $.ajax({
        url: "/attachmentURL",
        type: "POST",
        data: file,
        processData: false
    });
});

Es wird hier beschrieben: https://developer.mozilla.org/de/DOM/XMLHttpRequest/Sending_and_Receiving_Binary_Data#section_3

Das Senden einer Zeichenfolge (auch wenn diese Zeichenfolge binäre Daten darstellt) funktioniert nicht, da der Browser sie zwangsweise in Unicode konvertiert und als utf-8 als Angabe kodiert, wodurch die binären Daten beschädigt werden:

Wenn Daten eine Zeichenfolge sind, lassen Sie die Kodierung UTF-8 sein.

Der Mime-Typ sei "text/plain; charset = UTF-8".

Lassen Sie den Request-Entity-Body Daten in Unicode konvertieren und codieren als UTF-8.

Das Senden einer file-Referenz (blob) führt dazu aus:

Wenn Daten ein Blob sind Wenn das Typattribut des Objekts nicht leer ist string Mime-Typ sei sein Wert.

Der Anforderungsentitätskörper sei die durch Daten dargestellte Rohdaten.

31
Esailija

var-Datei;

        $('#_testFile').on("change", function (e) {
            file = e.target.files[0];
        });
        $('#_testButton').click(function () {
            var serverUrl = '/attachmentURL';

            $.ajax({
                type: "POST",
                beforeSend: function (request) {
                    request.setRequestHeader("Content-Type", file.type);
                },
                url: serverUrl,
                data: file,
                processData: false,
                contentType: false,
                success: function (data) {
                    console.log("File available at: ", data);
                },
                error: function (data) {
                    var obj = jQuery.parseJSON(data);
                    alert(obj.error);
                }
            });
        });
1
masoud soroush