Проводка ввода файла в виде двоичных данных 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, и результат одинаковый для обоих.
Кто-нибудь знает, что я могу изменить, чтобы сделать эту работу?
Ответы
Ответ 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);
}
});
});