Всем привет. Хочу отправить текстовый файл/картинку с помощью AJAX. С помощью интерфейса FormData всё собрать получается без проблем, а без него - надо вручную вбивать содержимое файла в заголовки. Делаю, как написано здесь https://learn.javascript.ru/xhr-forms Вопрос в том, как поместить содержимое загруженного файла в заголовки (а, если это будет картинка)? Если вставляю содержимое вот так, upload_file.files[0], вместо 'Наконец-то', то в сохраняемом файле сохраняется [Object]. HTML: <input type="file" id="file" multiple><br> <button type="submit" id="upload">Upload</button> Код (Javascript): var btn = document.getElementById('upload'); var upload_file = document.getElementById('file'); btn.onclick = function () { // console.log(upload_file.files[0]); var data = { name: 'Виктор', surname: 'Цой' }; var boundary = String(Math.random()).slice(2); var boundaryMiddle = '--' + boundary + '\r\n'; var boundaryLast = '--' + boundary + '--\r\n' var body = ['\r\n']; for (var key in data) { // добавление поля body.push('Content-Disposition: form-data; name="' + key + '"\r\n\r\n' + data[key] + '\r\n'); } body.push('Content-Disposition: form-data; name="myfile"; filename="test.txt"' + '\r\n' + 'Content-Type: text/plain\r\n\r\n' + 'Наконец-то!' + '\r\n'); body = body.join(boundaryMiddle) + boundaryLast; console.log(body); // Тело запроса готово, отправляем var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload.php', true); xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary); xhr.onreadystatechange = function() { if (this.readyState != 4) return; alert( this.responseText ); } xhr.send(body); }
Вот тут можно подробнее? --- Добавлено --- Да, небольшие файлы можно гонять через base64 без заморочек.
Проблема решена! Заместо слово "содержимое", что ниже, должно быть содержимое файла, которое мы выбрали на клиенте, но не отправили на сервер! Код (Text): --6812748192417928 Content-Disposition: form-data; name="myfile"; filename="test.txt" Content-Type: text/plain содержимое Потанцевал с бубном и сделал вот так (всё работает) : Код (Javascript): var btn = document.getElementById('upload'); var upload_file = document.getElementById('file'); btn.onclick = function () { var reader = new FileReader(); reader.readAsText(upload_file.files[0]); reader.onloadend = function () { alert(reader.result); send(reader.result); } } function send(file_content) { var data = { name: 'Виктор', surname: 'Цой' }; var boundary = String(Math.random()).slice(2); var boundaryMiddle = '--' + boundary + '\r\n'; var boundaryLast = '--' + boundary + '--\r\n'; var body = ['\r\n']; for (var key in data) { // добавление поля body.push('Content-Disposition: form-data; name="' + key + '"\r\n\r\n' + data[key] + '\r\n'); } body.push('Content-Disposition: form-data; name="myfile"; filename="test.txt"' + '\r\n' + 'Content-Type: text/plain\r\n\r\n' + file_content + '\r\n'); body = body.join(boundaryMiddle) + boundaryLast; console.log(body); // Тело запроса готово, отправляем var xhr = new XMLHttpRequest(); xhr.open('POST', '/submit.php', true); xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary); xhr.onreadystatechange = function() { if (this.readyState != 4) return; alert( this.responseText ); } xhr.send(body); }