2014-01-25 3 views
1

Я пишу веб-приложение в питоне/пирамиде, которое обрабатывает загрузку файла (через jquery uploader). Код для загрузки составляет:Как обрабатывать загрузку асинхронно в пирамиде

@view_config(route_name='file.upload', renderer='json') 
def file_upload(request): 

for item, filestorage in request.POST.items(): 
    f = File.create(filestorage) 

    u = Upload.create(f.hash) 

return { 
    'url': request.route_url('file.get', uploadid=u.urlid) 
} 

, где затем File.create делает sha1 файла и перемещает его в постоянном месте, помещая метаданные в базе данных. (Файл фактически является классом SQLAlchemy)

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

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

+0

Я не уверен здесь, но я думаю, что это связано с wsgi. Я думаю, что приложение вызывается только тогда, когда запрос завершен. Возможно, вы захотите посмотреть в этом направлении. –

+0

Я думаю, что Антуан прав. Вот как я всегда это понимал, чтобы работать –

+0

Я тоже так думаю, поэтому я отметил вопрос «wsgi»;) –

ответ

0

Может быть, вы можете найти некоторую помощь в этом проекте:

https://pypi.python.org/pypi/gp.fileupload/

+0

Это действительно казалось решением ... но это не так. Даже в этой библиотеке вся проверка выполняется после загрузки файла. Если я загружу 200M-файл с ограничением 5 M, он загрузит весь файл, а затем он предупредит меня, что он слишком большой. Неудовлетворительно. Я попробую с websockets –

3

В вашем случае предпочитают проверку на стороне клиента за пределы размера файла. Использование плагина jQuery требует, чтобы ваши клиенты включали Javascript.

Посмотрите на приложение для пирамиды PyGall. Он переключился с gp.fileupload на jQuery-File-Upload и injects file size limits from pyramid settings на jQuery plugin initialization. Он также вычисляет контрольную сумму md5 и хорошо применим к вашему прецеденту.

Кроме того, существует jQuery-File-Upload server-side implementation in pyramid. Но, с моей точки зрения, он имеет ограниченное использование и в настоящее время не работает без каких-либо исправлений.

Тем не менее, промежуточное ПО WSGI, например gp.fileupload, подключенное к вашему конвейеру WSGI, может выполнять проверки max_file_size.

Ваша вторая проблема - chunked file uploads. Это увеличивает сложность вашего обработчика загрузки на стороне сервера, реализованного в пирамиде, но позволяет вам create hashes from large files with less memory.

+1

«проверка на стороне клиента»? Шутки в сторону? Приходите ... –

+0

Проверка на стороне клиента для ограничений размера файла и допустимых типов mime - полезные функции, предлагаемые jQuery-File-Upload. Учитывая это, вы можете отказаться от загрузки на стороне клиента. В чем преимущество выбора плагина jQuery для загрузки файлов и использования каких-либо дополнительных функций? –

+0

Другой плагин jquery, в котором говорится об увеличении пользовательского опыта, если применяется проверка на стороне клиента - http://adamsanderson.github.io/jQuery-File-Validator/ –

Смежные вопросы