2011-06-20 88 views
0

我想上传的web2py形式的压缩文件,然后读取其中的内容:的web2py - 上传文件并读取内容为Zip文件

form = FORM(TABLE(
      TR(TD('Upload File:', INPUT(_type='file', 
             _name='myfile', 
             id='myfile', 
             requires=IS_NOT_EMPTY()))), 
      TR(TD(INPUT(_type='submit',_value='Submit'))) 
     )) 

if form.accepts(request.vars): 
    data=StringIO.StringIO(request.vars.myfile) 
    import zipfile 
    zfile=zipfile.Zipfile(data) 

出于某种原因,这个代码工作,并抱怨文件尽管上传的文件是一个zip文件,但不是一个zip文件。

我是Web2Py的新手。 data如何表示为zip文件?

回答

3

HTTP上传不只是原始二进制,它是混合多部分形式编码。写request.vars.myfile到磁盘上,你会看到,它会说,像

------------------BlahBlahBoundary 
Content-Disposition: type="file"; name="myfile" 
Content-Type: application/octet-stream 

<binary data> 
------------------BlahBlahBoundary-- 

这个天真的解决方案是,使用cgi.FieldStorage(),我公司提供的示例使用wsgi.input ,它是mod_wsgi的一部分。

form = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ) 
raw_filw = cStringIO.StringIO(form['myfile'].file.read()) 

有两点需要指出,这里

  • 始终使用cStringIO如果你拥有它,它 会比StringIO的

  • 更快,如果你允许上传这个样子,你 '将文件转换为内存, 因此,无论文件大小如何, 您将使用多少ram - 这不是 NOT scale。我不得不写自己的 自定义MIME流解析器,通过python流 文件到磁盘,以避免 这。但是,如果你正在学习或者这是一个概念证明,你应该没问题。

+0

感谢您的解决方案。 问题是,我现在正在测试服务器,而不是使用wsgi使其变得困难 – jitendra

+0

wsgi.input只是您提交的套接字上的文件句柄。使用request.vars.myfile代替wsgi.input – synthesizerpatel

5

web2py的表单字段上传已经是cgi.FieldStorage,您可以使用获得的原始上传字节:

data = request.vars.myfile.value 

对于不需要StringIO的一个类似文件的对象,使用方法:

filelike = request.vars.myfile.file 
zip = zipfile.Zipfile(filelike)