Скачивание и загрузка файлов Requests

Работа с файлами с использованием библиотеки Requests в Python

Библиотека Requests делает работу с файлами простой и интуитивной. Будь то загрузка файла на сервер или скачивание его с сервера,  это можно сделать за несколько строк кода.

Загрузка файлов на сервер

Загрузка файлов на сервер обычно происходит с использованием HTTP-метода POST (хотя это также может быть PUT в некоторых случаях). Для этого файл отправляется в теле запроса.

Давайте рассмотрим, как загрузить изображение на сервер:

import requests

url = 'https://api.example.com/upload'
files = {'file': ('filename.jpg', open('filename.jpg', 'rb'))}

response = requests.post(url, files=files)

В приведенном выше коде file - это имя поля, используемое сервером для получения файла, а filename.jpg - это имя файла, который мы хотим загрузить. Открыв файл в бинарном режиме rb, мы гарантируем, что файл будет прочитан корректно независимо от его содержимого.

Скачивание файлов с сервера

Скачивание файлов с сервера обычно выполняется с помощью метода GET. После выполнения запроса файл можно сохранить на диск.

Пример скачивания изображения с сервера:

url = 'https://api.example.com/image.jpg'
response = requests.get(url)

with open('downloaded_image.jpg', 'wb') as f:
    f.write(response.content)

При скачивании файла важно использовать атрибут content ответа, так как он содержит бинарные данные ответа.

Стриминг и большие файлы

Если вы работаете с большими файлами, напрямую сохранять response.content может быть неэффективно из-за потребления большого объема памяти. Вместо этого вы можете использовать стриминг:

response = requests.get(url, stream=True)

with open('large_file.jpg', 'wb') as f:
    for chunk in response.iter_content(chunk_size=8192):
        f.write(chunk)

Использование response.iter_content() позволяет вам читать ответ по частям и записывать его на диск, что особенно полезно при работе с большими файлами.

Отправка нескольких файлов

Вы можете отправлять несколько файлов за один раз, просто добавив их в словарь:

files = {
    'file1': ('filename1.jpg', open('filename1.jpg', 'rb')),
    'file2': ('filename2.jpg', open('filename2.jpg', 'rb'))
}

response = requests.post(url, files=files)

Управление заголовками файлов

При отправке файлов вы можете управлять дополнительной информацией, например, заголовками:

custom_headers = {
    'file': ('filename.jpg', open('filename.jpg', 'rb'), 'image/jpeg', {'Expires': '0'})
}

response = requests.post(url, files=custom_headers)

Здесь image/jpeg указывает MIME-тип файла, а {'Expires': '0'} добавляет дополнительные заголовки к файлу.

Загрузка файлов с использованием данных формы

Если сервер ожидает получение файлов вместе с другими данными формы, вы можете комбинировать files и data в одном запросе:

files = {'file': ('filename.jpg', open('filename.jpg', 'rb'))}
data = {'user_id': '12345', 'action': 'upload'}

response = requests.post(url, files=files, data=data)

Заключение

Библиотека Requests предоставляет простые инструменты для работы с файлами, упрощая процесс их загрузки и скачивания. Благодаря интуитивному интерфейсу и поддержке различных типов данных, Requests становится отличным выбором для взаимодействия с веб-серверами, которые работают с файлами.

Содержание: