Python Web2Py-上传一个文件并以Zip文件的形式读取内容

Python Web2Py-上传一个文件并以Zip文件的形式读取内容,python,web2py,zipfile,Python,Web2py,Zipfile,我正在尝试从Web2Py表单上载zip文件,然后读取内容: form = FORM(TABLE( TR(TD('Upload File:', INPUT(_type='file', _name='myfile', id='myfile',

我正在尝试从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
。如何将
数据
表示为zip文件?

HTTP上传不仅仅是原始二进制文件,它是混合的多部分编码形式。将request.vars.myfile写入磁盘,您会看到,它会说

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

<binary data>
------------------BlahBlahBoundary--
这里要指出两件事

  • 如果您有cStringIO,请始终使用它, 它会比StringIO快

  • 如果你允许像这样上传, 您正在将文件流式传输到ram中, 那么,不管这个文件有多大,它又是怎样的呢 您将要使用的内存太多-这是 不是规模。我必须自己写 自定义MIME流解析器到流 通过python将文件存储到磁盘以避免 这但是,如果你正在学习或者这是 一个概念的证明你应该很好


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

data = request.vars.myfile.value
对于不需要StringIO之类的文件,请使用:

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

谢谢你的解决方案。问题是,我现在正在测试服务器,而不是使用wsgi,这使它变得很困难。input只是submit套接字上的一个文件句柄。使用request.vars.myfile代替wsgi.input
filelike = request.vars.myfile.file
zip = zipfile.Zipfile(filelike)