2015-05-12 7 views
1

我正在將文件從Python發佈到供應商的API,供應商的API抱怨Content-Disposition標題中的內容缺少大小。他們給出的例子如下所示:是否有一個Python HTTP客戶端,允許您在發佈文件的Content-Disposition中設置大小?

Content-Disposition:form-data;文件名的文件名=;名=名;大小= 1234

是否有一個Python HTTP客戶端,可以讓我包含大小而不用重寫所有的東西?請求使用urllib3作爲文件發佈,而這些似乎不支持設置文件附件的大小。

+0

當您手動設置標題時會發生什麼? –

+0

我不認爲我可以請求,因爲它不是請求頭,它是文件頭。 – Carl

+0

當我看看'request.body'時,就像'''--d1cfff1341d94dd293f9aafd98ebc6e5 \ r \ n內容處置:表單數據; NAME = 「my_file」; filename =「filename.json」\ r \ nContent-Type:application/json \ r \ n \ r \ n ... file ... \ r \ n - d1cfff1341d94dd293f9aafd98ebc6e5 - \ r \ n''''。我可以添加更多的頭文件,比如'Content-Type:application/json',但我沒有看到任何改變'Content-Disposition'的方法。 – Carl

回答

0

爲了記錄在案,這裏就是我結束瞭解決我的問題:

from requests.packages.urllib3.fields import RequestField 
from requests.packages.urllib3.filepost import encode_multipart_formdata 


def prepare_body_with_size(request, files): 
    new_fields = [] 
    for name, filename, data, file_type in files: 
     rf = RequestField(name=name, data=data, filename=filename) 
     content_disposition = 'form-data; size=%d' % len(data) 
     rf.make_multipart(content_disposition=content_disposition, content_type=file_type) 
     new_fields.append(rf) 

    body, content_type = encode_multipart_formdata(new_fields) 
    request.headers['Content-Type'] = content_type 
    request.body = body 
    return request 

...

from requests import Request, Session 

with Session() as s: 
    req = Request('POST', POST_ENDPOINT) 
    prepped = req.prepare() 
    prepare_body_with_size(prepped, files) 
    response = s.send(prepped) 

的代碼大多是隻是一個請求prepare_body方法是如何工作的重寫。

相關問題