我正在尝试从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文件?
答案 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文件到磁盘以避免 这个。但是,如果你正在学习,或者这是 概念证明你应该没事。