2015-07-07 2 views
0

Я хочу использовать 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, она может успешно загрузиться. Поэтому я не думаю, что это проблема сервера.

+0

Включить CROS (совместное использование ресурсов кросс-начального уровня) на сервере и увеличить размер тела сообщения. – Vishnu

+1

Это может быть намного проще с помощью ['FormData'] (https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects#Sending_files_using_a_FormData_object) ... – CBroe

+0

@ Вишну Почему я должен включать CROS ? Страница, на которую я отправляю запрос, находится на одном сервере. Кроме того, поскольку я получу ошибку, даже если я отправлю небольшой файл, например текстовый/обычный файл, я не думаю, что причиной является размер тела. – Shiyou

ответ

0

В типа содержимого строки:

xhr.setRequestHeader('Content-type', 'multipart/form-data; boundary=' + boundary) 

Ваш код обеспечивают:

multipart/form-data; boundary=------xxxxxxxxx 

Но, должно быть:

multipart/form-data; boundary=----xxxxxxxxx 

Обратите внимание на количество тире.

Так изменить его:

xhr.setRequestHeader('Content-type', 'multipart/form-data; boundary=' + boundary.substr(2)) 

И попробуйте еще раз.

+0

Я изменил Content-type, как вы сказали ('multipart/form-data; border = ---- multipartformboundary14e6654eec2'). Тем не менее, он по-прежнему дает мне 400 ошибок. – Shiyou

0
   var Self = this; 
        Self.xhr = new XMLHttpRequest(); 
        Self.url = "./connect.php"; // your file to post data 
        Self.xhr.open("POST",Self.url,true); 
        Self.xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
        Self.xhr.onreadystatechange = function() { 
        if(Self.xhr.readyState == 4 && Self.xhr.status == 200) { 
        Self.return_data = Self.xhr.responseText.trim(); 

        } 
       Self.xhr.send(Self.logData); 

Это как данные POST для моего сервера с использованием запроса XHR. и connect.php обновит мою базу данных. поэтому вы можете добавить, какие данные вам нужно отправить в «Self.logData», прежде чем делать запрос XHR. и вам нужен файл типа connect.php или какой-либо другой для обработки данных сообщения на стороне сервера.

+0

Извините, что такое экземпляр logData?или это просто простой объект? – Shiyou

+0

@Shiyou Просто простой объект. вы можете изменить его на все, что хотите – Vishnu

+0

Кроме того, я хочу, это файл сообщения. Однако ваш тип контента - application/x-www-form-urlencoded, который не может делать то, что я хочу. – Shiyou