Vấn đề: Khi đăng dữ liệu với urllib2 của Python, tất cả dữ liệu được mã hóa và gửi dưới dạng Content-Type: application/x-www-form-urlencoded. Khi tải lên tệp, thay vào đó, Content-Type sẽ được đặt thành multipart/form-data và nội dung được mã hóa MIME. Một cuộc thảo luận về vấn đề này là ở đây: http://code.activestate.com/recipes/146306/Sử dụng MultipartPostHandler để POST dạng dữ liệu với Python
Để khắc phục hạn chế này một số lập trình mạnh tạo ra một thư viện gọi MultipartPostHandler mà tạo ra một OpenerDirector bạn có thể sử dụng với urllib2 để chủ yếu là tự động POST với multipart/form-data. Bản sao của thư viện này có tại đây: http://peerit.blogspot.com/2007/07/multipartposthandler-doesnt-work-for.html
Tôi mới sử dụng Python và không thể làm cho thư viện này hoạt động. Tôi đã viết về cơ bản đoạn mã sau. Khi tôi chụp nó trong một proxy HTTP cục bộ, tôi có thể thấy rằng dữ liệu vẫn được mã hóa URL và không mã hóa MIME nhiều phần. Xin hãy giúp tôi tìm ra những gì tôi đang làm sai hoặc một cách tốt hơn để hoàn thành công việc này. Cảm ơn :-)
FROM_ADDR = '[email protected]'
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: Cảm ơn phản hồi của bạn. Tôi nhận thức được giải pháp ActiveState httplib này (tôi liên kết với nó ở trên). Tôi muốn trừu tượng đi vấn đề và sử dụng một số lượng tối thiểu của mã để tiếp tục sử dụng urllib2 như thế nào tôi đã được. Bất kỳ ý tưởng tại sao opener không được cài đặt và sử dụng?
Đây chính xác là những gì tôi cần! Thanh danh. –
Tôi biết đây là một bài cũ, nhưng tôi nhận được điều này từ poster: 'AttributeError: multipart_yielder instance không có thuộc tính '__len __'' tự hỏi nếu có ai khác có prob này. – Andy
@nalroff Bạn đã không gọi 'poster.streaminghttp.register_openers()' –