0

我正在尝试设置使用 mod_wsgi 上传 xml 文件的可能性。为此,我构建了一个像这样的公式:

 <form action="upload.py" method="post" enctype="multipart/form-data">
      <input name="file" type="file" accept="text/xml"><br/>
      <input type="submit" value="upload">
 </form>

和一个文件upload.py

 ..
 form = cgi.FieldStorage(fp=environ['wsgi.input'], 
                         environ=environ, 
                         keep_blank_values=True)
 fileitem = form['file']
 ..

但是,这在访问表单中的“文件”时给了我一个键错误。印刷environ['wsgi.input'].read(request_body_size)显示:

------WebKitFormBoundaryeplWkFZe2clFMtgf
Content-Disposition: form-data; name="file"; filename="file.xml"
Content-Type: application/octet-stream

<?xml version="1.0" ?>
....

因此, wsgi.input 似乎是有效的。调试暴露了这一点cgi.FieldStorage() = FieldStorage(None, None, [])。你知道问题出在哪里吗?我错过了什么吗?

4

1 回答 1

1

我注意到了同样的情况并放置了线条:

request_body_size = int( environ.get('CONTENT_LENGTH') )
print environ['wsgi.input'].read(request_body_size)

调用cgi.FieldStorage()withwsgi.input作为参数之前,它会显示正文。显然,wsgi.inputfileIO-object 在 FS 内部被消耗,之后就无法读取它。在将它与 FS 一起使用之前,我尝试阅读它两次,并且发生了同样的情况,只有第一次有效。

编辑:是的,而且更糟的是, wsgi.input 没有实现 .seek() 方法来将其重新开始。唯一合理的方法是将其复制到 io.BytesIO 类实例中并将提供给FS。以后可以用 .seek() 来回退,无论如何。请注意,可以使用 StringIO 但如果您正在上传二进制文件,则会中断。

于 2018-03-05T12:15:59.870 回答