Как передать файл по протоколу HTTP

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

Ответ

Да, файлы можно передавать по HTTP, используя методы POST или PUT. Существует два основных подхода:

1. Использование multipart/form-data

Это стандартный способ для загрузки файлов через HTML-формы. Тело запроса состоит из нескольких частей, одна из которых содержит бинарные данные файла.

Пример на Python с библиотекой requests:

import requests

# URL-адрес для загрузки файла
url = 'https://example.com/upload'

# Открываем файл в бинарном режиме ('rb')
with open('document.pdf', 'rb') as f:
    files = {'file': f}
    response = requests.post(url, files=files)

print(f"Статус ответа: {response.status_code}")

2. Передача файла как бинарного тела запроса

Этот метод подходит для API, где ожидается получение только файла без дополнительных полей. В этом случае тело запроса — это сырые байты файла, а в заголовке Content-Type указывается его MIME-тип.

Пример на Python:

import requests

url = 'https://example.com/upload-raw'

with open('image.png', 'rb') as f:
    data = f.read()

headers = {'Content-Type': 'image/png'}
response = requests.post(url, data=data, headers=headers)

print(f"Статус ответа: {response.status_code}")

Ключевые аспекты:

  • Бинарный режим: Файлы всегда следует читать в бинарном режиме ('rb'), чтобы избежать проблем с кодировками.
  • Заголовки: Правильный Content-Type критически важен для корректной обработки файла на сервере.
  • Ограничения сервера: Сервер может накладывать ограничения на максимальный размер загружаемого файла.