Я хочу использовать AJAX для загрузки.Как использовать AJAX для загрузки файла
Это мой HTML код
<form id="upload-form" enctype="multipart/form-data" method="post" action="upload">
File Name:<input type="text" name="name" /><br />
<input type="file" name="file" /><br />
<input type="submit" />
</form>
Это мой код JavaScript:
var file = document.querySelector("[type=file]").files[0],
reader = new FileReader;
reader.onload = function(e){
var xhr = new XMLHttpRequest
xhr.open("POST", document.querySelector("form#upload-form").action, true);
//set payload
var boundary = '------multipartformboundary' + (new Date).getTime().toString(16);
var dashdash = '--';
var crlf = '\r\n';
var payload = '';
payload += boundary;
payload += crlf;
payload += 'Content-Disposition: form-data; name="file"';
payload += crlf;
payload += 'Content-Type: ' + file.type;
if (file.fileName) {
payload += '; filename="' + file.name + '"';
}
payload += crlf + crlf;
payload += reader.result;
payload += crlf;
payload += boundary;
payload += crlf;
payload += 'Content-Disposition: form-data; name="name"';
payload += crlf + crlf;
payload += document.querySelector("[name=name]").value || ""
payload += crlf;
payload += boundary;
payload += dashdash;
xhr.setRequestHeader('Content-type', 'multipart/form-data; boundary=' + boundary)
xhr.send(payload)
}
reader.readAsBinaryString(file)
Полезная нагрузка запроса выглядит следующим образом:
------multipartformboundary14e6631b3eb
Content-Disposition: form-data; name="file"
Content-Type: image/png
PNG
(some binary code)
------multipartformboundary14e6631b3eb
Content-Disposition: form-data; name="name"
My test file
------multipartformboundary14e6631b3eb--
Однако статус запроса .
В описании говорится: «Запрос, отправленный клиентом, был синтаксически неправильным». (Сервер Servlet + Tomcat 8)
Когда я просто отправлю форму без AJAX, она может успешно загрузиться. Поэтому я не думаю, что это проблема сервера.
Включить CROS (совместное использование ресурсов кросс-начального уровня) на сервере и увеличить размер тела сообщения. – Vishnu
Это может быть намного проще с помощью ['FormData'] (https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects#Sending_files_using_a_FormData_object) ... – CBroe
@ Вишну Почему я должен включать CROS ? Страница, на которую я отправляю запрос, находится на одном сервере. Кроме того, поскольку я получу ошибку, даже если я отправлю небольшой файл, например текстовый/обычный файл, я не думаю, что причиной является размер тела. – Shiyou