如何在金字塔中异步处理文件上传

时间:2014-01-25 16:19:20

标签: python http upload pyramid wsgi

我正在python / pyramid中编写一个Web应用程序来处理文件的上传(通过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类)

这里的问题是视图可调用在之后被称为,即文件传输到服务器已完成。这带来两个问题:第一个问题是,如果文件传输大于某个大小,我就无法拒绝文件传输。第二个是我必须等待接收整个文件然后我才能开始散列它。

我想要获得的是开始处理文件 - 某种流 - 一旦我获取数据,所以我可以在用户上传时散列它,我可以停止传输,如果大小是大于某个值。

2 个答案:

答案 0 :(得分: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管道中的WSGI中间件(如gp.fileupload)可以执行max_file_size检查。

你的第二个问题是关于chunked file uploads。这会增加金字塔中实施的服务器端上传处理程序的复杂性,但可以使您create hashes from large files with less memory.

答案 1 :(得分:0)

也许你可以在这个项目中找到一些帮助:

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