python: анализ HTTP-запроса POST с загрузкой файла и дополнительными параметрами - PullRequest
3 голосов
/ 11 октября 2009

Задача проста: на стороне сервера (python) принять HTTP POST, который содержит загруженный файл и дополнительные параметры формы.

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

Все методы, которые я нашел, основаны на cgi.FieldStorage, который каким-то образом позволяет только получить файл целиком (в памяти, что само по себе является катастрофой). Некоторые советуют переопределить метод FieldStorage.make_file (), который, похоже, нарушает реализацию cgi (странно ...).

В настоящее время я могу прочитать весь ввод wsgi, фрагмент за фрагментом, в файловую систему, в результате чего получаются следующие данные:

-----------------------------9514143097616
Content-Disposition: form-data; name="myfile"; filename="inbound_marketing_cartoon_ebook.pdf"
Content-Type: application/pdf

... 1.5 MB of PDF data

-----------------------------9514143097616
Content-Disposition: form-data; name="tid"

194
-----------------------------9514143097616--

Кто-нибудь знает, есть ли библиотеки Python, которые могли бы надежно разобрать эту вещь? Или я должен сделать это вручную? (Это Python 2.5)

Спасибо.

Ответы [ 3 ]

2 голосов
/ 12 октября 2009

Как вы предложили, я бы (и делал раньше) переопределить метод make_file объекта FieldStorage. Просто верните объект, который имеет метод write, который принимает данные (в файл или память или что-то еще) и отслеживает, сколько было получено для вашего индикатора прогресса.

Делая это таким образом, вы также получаете доступ к длине файла (предоставленной клиентом), имени файла и ключу, под которым он размещен.

Почему вам кажется, что это нарушает реализацию CGI?

Другой вариант - выполнить отслеживание прогресса в браузере с помощью флэш-загрузчика (на ум приходит YUI Uploader и SWFUpload ) и полностью пропустить отслеживание на сервере. Тогда вам не нужно получать серию запросов AJAX для получения прогресса.

1 голос
/ 11 октября 2009

Это кажется нелогичным (и я чувствую, что модуль имеет неправильное имя), но email, вероятно, будет делать то, что вы хотите. Я никогда не использовал его, но коллега имеет в системе обработки электронной почты; поскольку эти сообщения по своей природе являются просто RFC 2822, email, вероятно, их проанализирует.

Документация для email на первый взгляд довольно полная.

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

0 голосов
/ 12 октября 2009

Возможно, вы захотите взглянуть на то, что сделал Джанго. У них есть действительно хорошая реализация пользовательских обработчиков загрузки файлов, которая позволяет подклассировать их для включения таких вещей, как индикаторы выполнения и т. Д. См. документацию и соответствующий код - даже если вы не используете не хочу использовать Django, он обязательно даст вам несколько идей.

...