0

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

4

2 回答 2

6

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

data = request.vars.myfile.value

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

filelike = request.vars.myfile.file
zip = zipfile.Zipfile(filelike)
于 2011-09-15T01:33:36.270 回答
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 快

  • 如果您允许这样的上传,您会将文件流式传输到内存中,因此,无论文件多大,您将使用多少内存 - 这不会扩展。我必须编写自己的自定义 MIME 流解析器来通过 python 将文件流式传输到磁盘以避免这种情况。但是,如果你正在学习或者这是一个概念证明,你应该没问题。

于 2011-06-20T07:01:31.697 回答