JavaScript: Завантажити файл


189

Скажімо, у мене цей елемент на сторінці:

<input id="image-file" type="file" />

Це створить кнопку, яка дозволяє користувачам веб-сторінки вибирати файл через діалогове вікно ОС «Відкрити файл ...» у браузері.

Скажімо, користувач натискає зазначену кнопку, вибирає файл у діалоговому вікні, а потім натискає кнопку "Гаразд", щоб закрити діалогове вікно.

Вибране ім’я файлу тепер зберігається у:

document.getElementById("image-file").value

Тепер скажімо, що сервер обробляє декілька частин POST за URL-адресою "/ upload / image".

Як мені надіслати файл на "/ upload / image"?

Крім того, як я слухаю сповіщення про завантаження файлу?


2
JavaScript не обробляє завантаження, оскільки він знаходиться на сервері. Сценарій на стороні сервера отримає файл, а потім перемістить його. Для php з тимчасової папки в потрібну папку.
Бакудан


15
Проголосували за повторне відкриття, оскільки питання стосується POJS (звичайний старий JavaScript), а не jQuery.
e2-e4

Відповіді:


95

Якщо ви не намагаєтеся завантажити файл за допомогою ajax, просто надішліть форму до /upload/image.

<form enctype="multipart/form-data" action="/upload/image" method="post">
    <input id="image-file" type="file" />
</form>

Якщо ви хочете завантажити зображення у фоновому режимі (наприклад, не надсилаючи всієї форми), ви можете використовувати ajax:


або iframe розміром 0x0 із скриптом для завантаження зображень всередині його src = "" і розміщуйте його форму за допомогою target = "iframeId", читаючи результат назад на події iframe src .load, яка може бути пов'язана, наприклад, jQuery.
Дмитро

11
Насправді можливо звернутись за допомогою Javascript та Ajax, див.: Stackoverflow.com/a/10811427/694469 (я не подав заявки).
KajMagnus

35
@KajMagnus, ти, мабуть, мав на увазі "завантажити", але випадково сказав "upvote"
Самуель Аллан

85

Чистий JS

Ви можете необов’язково використовувати функцію " добування"

let photo = document.getElementById("image-file").files[0];
let formData = new FormData();

formData.append("photo", photo);
fetch('/upload/image', {method: "POST", body: formData});

Підхід до старої школи - ххр

let photo = document.getElementById("image-file").files[0];  // file from input
let req = new XMLHttpRequest();
let formData = new FormData();

formData.append("photo", photo);                                
req.open("POST", '/upload/image');
req.send(formData);

ПІДСУМОК

  • На стороні сервера ви можете прочитати назву оригіналу файлу (та іншу інформацію), яка автоматично включається для запиту браузера у filenameпараметрі formData.
  • НЕ потрібно встановлювати заголовок запиту Content-Typeна multipart/form-data- це буде встановлено автоматично браузером.
  • Замість цього /upload/imageви можете використовувати повну адресу типу http://.../upload/image.
  • Якщо ви хочете надіслати багато файлів за один запит, використовуйте multipleатрибут: <input multiple type=... />та додайте всі обрані файли до formData аналогічним чином (наприклад, photo2=...files[2];... formData.append("photo2", photo2);)
  • Ви можете включити додаткові дані (json), щоб запитувати, наприклад, let user = {name:'john', age:34}таким чином:formData.append("user", JSON.stringify(user));
  • Це рішення має працювати у всіх основних браузерах.

Мені ідеально працювати.
Trieu Nguyen

formData === форму податиenctype="multipart/form-data"
xgqfrms

Я отримую помилкуnet::ERR_ABORTED 405 (Method Not Allowed)
Hidayt Rahman

@HidaytRahman ця помилка, як правило, з’являється, коли сервер не застосовує метод POST для вашого URL
Kamil Kiełczewski

1
Дивно - Відповідно до вашої рубрики, я думав, нам більше не потрібен сервер: D
Hidayt Rahman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.