【问题标题】:cgi.FieldStorage remains emptycgi.FieldStorage 保持为空
【发布时间】:2012-07-24 05:20:39
【问题描述】:

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

【问题讨论】:

  • 您应该真正使用框架。 Bottle 和 Flask 都很小巧,易于使用。
  • 我决定使用 Bottle。然而,这里的问题是
    的 HTML 代码。我不知道究竟是什么导致了这个问题,虽然重写
    部分解决了错误。

标签: python cgi wsgi


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-31
    • 2018-11-19
    • 2014-08-29
    • 2016-06-30
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多