Web2Py - 上传文件并将内容读取为Zip文件

时间:2011-06-20 06:27:40

标签: python web2py zipfile

我正在尝试从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文件?

2 个答案:

答案 0 :(得分:6)

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

data = request.vars.myfile.value

对于类文件对象,不需要StringIO,请使用:

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

答案 1 :(得分: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, 所以,无论文件大小如何 你会使用多少公羊 - 这样做 不规模。我不得不写自己的 流的自定义MIME流解析器 通过python文件到磁盘以避免 这个。但是,如果你正在学习,或者这是 概念证明你应该没事。