python request - 使用POST腳本從Python腳本發送文件




4 Answers

來自: http://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file : http://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file

請求使得上傳Multipart編碼文件變得非常簡單:

with open('report.xls', 'rb') as f:
    r = requests.post('http://httpbin.org/post', files={'report.xls': f})

而已。 我不是在開玩笑 - 這是一行代碼。 該文件已發送。 讓我們檢查:

>>> r.text
{
  "origin": "179.13.100.4",
  "files": {
    "report.xls": "<censored...binary...data>"
  },
  "form": {},
  "url": "http://httpbin.org/post",
  "args": {},
  "headers": {
    "Content-Length": "3196",
    "Accept-Encoding": "identity, deflate, compress, gzip",
    "Accept": "*/*",
    "User-Agent": "python-requests/0.8.0",
    "Host": "httpbin.org:80",
    "Content-Type": "multipart/form-data; boundary=127.0.0.1.502.21746.1321131593.786.1"
  },
  "data": ""
}
send file

有沒有辦法從Python腳本使用POST發送文件?




唯一阻止你直接在文件對像上使用urlopen的事實是內建文件對象缺少len定義。 一個簡單的方法是創建一個提供正確文件的urlopen的子類。 我也修改了下面的文件中的Content-Type標題。

import os
import urllib2
class EnhancedFile(file):
    def __init__(self, *args, **keyws):
        file.__init__(self, *args, **keyws)

    def __len__(self):
        return int(os.fstat(self.fileno())[6])

theFile = EnhancedFile('a.xml', 'r')
theUrl = "http://example.com/abcde"
theHeaders= {'Content-Type': 'text/xml'}

theRequest = urllib2.Request(theUrl, theFile, theHeaders)

response = urllib2.urlopen(theRequest)

theFile.close()


for line in response:
    print line



Chris Atlee的poster庫非常適合這個(特別是便利功能poster.encode.multipart_encode() )。 作為獎勵,它支持大文件的流式傳輸,無需將整個文件加載到內存中。 另請參閱Python問題3244




您可能還想看看httplib2 ,並附帶examples 。 我發現使用httplib2比使用內置的HTTP模塊更簡潔。




Related