cgi.FieldStorage仍为空

时间:2012-07-25 17:39:42

标签: python cgi wsgi

我正在尝试使用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, [])。你知道问题出在哪里吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

我注意到了这一点并放置了一行:

request_body_size = int( environ.get('CONTENT_LENGTH') )
print environ['wsgi.input'].read(request_body_size)
在以cgi.FieldStorage()作为参数调用wsgi.input之前

,它会显示正文。显然,wsgi.input fileIO-object在FS内被消耗,之后无法读取它。我在尝试将它与FS一起使用之前尝试了两次,同样的事情发生了,只有第一次工作。

编辑:是的,更糟糕​​的是,wsgi.input没有实现.seek()方法将其重新开始。唯一合理的方法是将它复制到io.BytesIO类实例中并将 输入FS。无论如何,它可以用.seek()回卷。请注意,可以使用StringIO,但如果您要上传二进制文件,则会中断。