sie*_*z0r 8 python cgi multipartform-data python-3.x
以下代码应该能够在Python 2.7和Python 3.x中运行.
from __future__ import unicode_literals
from __future__ import print_function
import cgi
try:
from StringIO import StringIO as IO
except ImportError:
from io import BytesIO as IO
body = """
--spam
Content-Disposition: form-data; name="param1"; filename=blob
Content-Type: binary/octet-stream
value1
--spam--
"""
parsed = cgi.FieldStorage(
IO(body.encode('utf-8')),
headers={'content-type': 'multipart/form-data; boundary=spam'},
environ={'REQUEST_METHOD': 'POST'})
print([key for key in parsed])
Run Code Online (Sandbox Code Playgroud)
在Python 2.7中它运行正常并输出['param1'].然而,在Python 3.4中,它输出[None].
我无法FieldStorage在Python 3中获得可用的结果.我怀疑内部发生了一些变化,我现在正在使用它.但是我似乎无法弄清楚是什么.任何帮助表示赞赏.
这些更改将使您的脚本在Python 2.7.x和3.4.x中的工作方式相同:
(我将这些缩写用于cgi.FieldStorage():Python 2.7.x:FS27,Python 3.4.x:FS34)
1 - FS27正确处理边界之前的换行符,而FS34则不是这种情况,因此解决方案是直接从您的border(spam)开始。
body = """--spam
Content-Disposition: form-data; name="param1"; filename=blob
Content-type: binary/octet-stream
value1
--spam--
"""
Run Code Online (Sandbox Code Playgroud)
2-从cgi.py 源引用(在FS34的定义注释中):
参数,所有可选:
fp:文件指针;默认值:sys.stdin.buffer(当请求方法为GET时不使用)
Run Code Online (Sandbox Code Playgroud)Can be : 1. a TextIOWrapper object 2. an object whose read() and readline() methods return bytes
灰色部分不存在于FS27定义,因此,大部分的之间的差异FS27和FS34中的处理谎言字符串(FS27)和二进制流(FS34) 。
在这种情况下,除非为如何正确处理此解析提供了正确的指导,否则FS34可以轻易弄乱解析对象的语义。显然,headers词典条目'content-type': 'multipart/form-data; boundary=spam'
还不够;您必须提供消息长度信息。
您可以通过在以下位置添加第二个条目来有效地实现这一点headers:
headers={'content-type': 'multipart/form-data; boundary=spam;',
'content-length': len(body)}
Run Code Online (Sandbox Code Playgroud)
其中值的content-length 关键是 body长度(包括开始/结束边界)。
这些修改相结合,可以达到预期的结果:
headers={'content-type': 'multipart/form-data; boundary=spam;',
'content-length': len(body)}
Run Code Online (Sandbox Code Playgroud)
作为概念验证,这些都是FS27和FS34的返回parsed对象:
...
print(parsed)
...
Run Code Online (Sandbox Code Playgroud)
产量:
$ python script.py
['param1']
$ python3 script.py
['param1']
Run Code Online (Sandbox Code Playgroud)
对于FS27,以及
...
print(parsed)
...
Run Code Online (Sandbox Code Playgroud)
对于FS34。
| 归档时间: |
|
| 查看次数: |
2506 次 |
| 最近记录: |