gpt4 book ai didi

python - 使用 MultipartPostHandler 通过 Python 发布表单数据

转载 作者:IT老高 更新时间:2023-10-28 20:33:40 25 4
gpt4 key购买 nike

问题:当使用 Python 的 urllib2 发布数据时,所有数据都经过 URL 编码并作为 Content-Type: application/x-www-form-urlencoded 发送。上传文件时,Content-Type 应该设置为 multipart/form-data 并且内容是 MIME 编码的。

为了解决这个限制,一些敏锐的编码人员创建了一个名为 MultipartPostHandler 的库,该库创建了一个 OpenerDirector,您可以将其与 urllib2 一起使用,以自动使用 multipart/form-data 进行 POST。该库的副本在这里:MultipartPostHandler doesn't work for Unicode files

我是 Python 新手,无法让这个库正常工作。我基本上写了以下代码。当我在本地 HTTP 代理中捕获它时,我可以看到数据仍然是 URL 编码的,而不是多部分 MIME 编码的。请帮助我找出我做错了什么或更好的方法来完成这项工作。谢谢:-)

FROM_ADDR = 'my@email.com'

try:
data = open(file, 'rb').read()
except:
print "Error: could not open file %s for reading" % file
print "Check permissions on the file or folder it resides in"
sys.exit(1)

# Build the POST request
url = "http://somedomain.com/?action=analyze"
post_data = {}
post_data['analysisType'] = 'file'
post_data['executable'] = data
post_data['notification'] = 'email'
post_data['email'] = FROM_ADDR

# MIME encode the POST payload
opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler)
urllib2.install_opener(opener)
request = urllib2.Request(url, post_data)
request.set_proxy('127.0.0.1:8080', 'http') # For testing with Burp Proxy

# Make the request and capture the response
try:
response = urllib2.urlopen(request)
print response.geturl()
except urllib2.URLError, e:
print "File upload failed..."

EDIT1:感谢您的回复。我知道 ActiveState httplib 解决方案(我在上面链接到它)。我宁愿抽象出问题并使用最少的代码来继续使用 urllib2。知道为什么没有安装和使用开启器吗?

最佳答案

似乎解决这个问题的最简单和最兼容的方法是使用“海报”模块。

# test_client.py
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import urllib2

# Register the streaming http handlers with urllib2
register_openers()

# Start the multipart/form-data encoding of the file "DSC0001.jpg"
# "image1" is the name of the parameter, which is normally set
# via the "name" parameter of the HTML <input> tag.

# headers contains the necessary Content-Type and Content-Length
# datagen is a generator object that yields the encoded parameters
datagen, headers = multipart_encode({"image1": open("DSC0001.jpg")})

# Create the Request object
request = urllib2.Request("http://localhost:5000/upload_image", datagen, headers)
# Actually do the request, and get the response
print urllib2.urlopen(request).read()

这很完美,我不必对 httplib 感到厌烦。该模块可在此处获得: http://atlee.ca/software/poster/index.html

关于python - 使用 MultipartPostHandler 通过 Python 发布表单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/680305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com