Ajax с использованием загрузки файла

Я создаю почтовую страницу для отправки писем. Мне нужно прикрепить файл перед отправкой. Как я могу сделать это с помощью AJAX? Сначала мне нужно сохранить эти файлы на сервере, а затем я должен отправить почту. Эти действия выполняются с помощью одной кнопки отправки.

3 ответа

Решение

Посмотрите на фрагмент ниже, который отправляет текстовые данные и прикрепленные файлы. Вcontent-type='multipart/form-data' устанавливается браузером автоматически, имя файла также автоматически добавляется в filename Параметр FormData (и может быть легко прочитан сервером).

async function sendEmail() {
  let formData = new FormData();
  let msg = { message: emailText.value };
 
  formData.append("email", JSON.stringify(msg)); 
  [...attachment.files].map( (file,i) => formData.append("file"+i, file) );

  try {
    await fetch('your/api/upload/email', { method: "POST", body: formData });
    alert("Email was send!");
  } catch(e) {
    alert("Problem with email sending");
  }
}
<textarea id="emailText" placeholder="Type message here"></textarea><br>

<input type="file" id="attachment" multiple /><br><br>
<input type="button" value="Send email" onclick="sendEmail()" />

<br><br><span style="color:red">In this snippet API not exists so exception will be thrown but you can look on your request in:<br> chrome console> network tab</span>

Вы должны динамически создать скрытый iframe в вашей DOM и установить цель вашей формы загрузки на этот iframe. Не забудьте установить метод формы POST.

Вы можете одновременно загружать и заполнять поля сообщений.

Вы должны обязательно проверить готовые компоненты, делающие это для выбранной вами библиотеки javascript.

Я надеюсь, вы знаете, как сделать нормальную загрузку. Вызовите загрузку / чтение и обновление файла при нажатии кнопки с помощью вызова ajax. Вы должны отправить путь к локальному системному файлу в качестве входных данных, а затем ответ должен содержать путь на сервере или ошибку. Обновите ссылку на вложение с ответом на случай, если ошибок нет.

Другие вопросы по тегам