Как передать файл в теле HTTP-запроса?

«Как передать файл в теле HTTP-запроса?» — вопрос из категории HTTP и веб-протоколы, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, файлы передаются в теле HTTP-запроса. Основные методы — использование типа контента multipart/form-data для форм или application/octet-stream для бинарных данных.

1. Multipart/form-data (Стандарт для HTML-форм и API)

Используется, когда нужно отправить файлы вместе с другими полями формы.

Пример HTTP-запроса:

POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=MyBoundary123

--MyBoundary123
Content-Disposition: form-data; name="description"

Профильное фото
--MyBoundary123
Content-Disposition: form-data; name="file"; filename="avatar.jpg"
Content-Type: image/jpeg

<бинарные данные файла>
--MyBoundary123--

Пример на JavaScript с fetch:

const formData = new FormData();
formData.append('file', fileInput.files[0]);
formData.append('comment', 'Мой файл');

fetch('/api/upload', {
  method: 'POST',
  body: formData // Заголовок Content-Type установится автоматически
});

2. Direct Binary Upload

Файл передается как есть, без дополнительных полей.

Пример:

PUT /files/avatar.jpg HTTP/1.1
Host: example.com
Content-Type: application/octet-stream

<бинарные данные файла>

Ключевые моменты:

  • Для больших файлов используйте Content-Length или Transfer-Encoding: chunked.
  • Всегда проверяйте MIME-тип и размер файла на сервере в целях безопасности.