問題: Python の urllib2 でデータを POST すると、すべてのデータが URL エンコードされ、Content-Type: application/x-www-form-urlencoded として送信されます。ファイルをアップロードするときは、代わりに Content-Type を multipart/form-data に設定し、コンテンツを MIME エンコードする必要があります。
この制限を回避するために、一部の鋭いコーダーは MultipartPostHandler と呼ばれるライブラリを作成しました。これは、urllib2 で使用できる OpenerDirector を作成し、multipart/form-data でほぼ自動的に POST します。このライブラリのコピーは次のとおりです: MultipartPostHandler does not 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 を引き続き使用したいと思います。オープナーがインストールおよび使用されていない理由は何ですか?