Подтвердить что ты не робот

Проводка ввода файла в виде двоичных данных FileReader через AJAX Post

Я пытаюсь опубликовать вложение, загруженное в файл HTML, вводимое на веб-страницу через API-интерфейс для отдыха. В документации по API указано, что сообщение представляет собой прямой двоичный контент как тело HTTP-запроса, а не загрузку файла формы.

Мой код выглядит следующим образом:

$('#_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)
})

Мне нужно, чтобы это работало для нескольких разных mimeTypes, поэтому я не объявлял его в приведенном выше коде. Тем не менее, я попытался объявить contentType: "application/msword" для файла .doc, а также попробовал processData: false и contentType: false.

Данные публикуются там, где это необходимо. Однако, когда я открываю файл, я получаю сообщение, в котором говорится mimeType: application/x-empty с пустым файлом ИЛИ файлом с кучей двоичных символов. Я пробовал файлы .doc и файлы PDF, и результат одинаковый для обоих.

Кто-нибудь знает, что я могу изменить, чтобы сделать эту работу?

4b9b3361

Ответ 1

Просто отправьте ссылку file в качестве данных (с помощью processData: false) выполнило мою работу как минимум:

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

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

Здесь описано: https://developer.mozilla.org/en/DOM/XMLHttpRequest/Sending_and_Receiving_Binary_Data#section_3

Отправка строки (даже если эта строка представляет двоичные данные) не будет работать, потому что браузер принудительно превратит ее в unicode и закодирует как utf-8 как указанный, который повредит двоичные данные:

Если данные являются строкой, пусть кодировка UTF-8.

Пусть тип mime будет "text/plain; charset = UTF-8".

Пусть тело объекта запроса будет преобразовано в Юникод и закодировано как UTF-8.

Отправка file ссылки (blob) сделает следующее:

Если данные являются Blob Если атрибут типа объекта не является пустым string let mime type будет его значением.

Пусть тело объекта запроса является необработанными данными, представленными данными.

Ответ 2

var file;

        $('#_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);
                }
            });
        });