我正在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类)
这里的问题是视图可调用在之后被称为,即文件传输到服务器已完成。这带来两个问题:第一个问题是,如果文件传输大于某个大小,我就无法拒绝文件传输。第二个是我必须等待接收整个文件然后我才能开始散列它。
我想要获得的是开始处理文件 - 某种流 - 一旦我获取数据,所以我可以在用户上传时散列它,我可以停止传输,如果大小是大于某个值。
答案 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)
也许你可以在这个项目中找到一些帮助: