如何使用Python的requests庫上傳檔案?
P粉071559609
P粉071559609 2023-08-16 18:44:37
0
2
647
<p>我正在使用Python的requests庫執行一個簡單的任務,即上傳檔案。我在Stack Overflow搜尋了一下,似乎沒有人遇到同樣的問題,也就是伺服器沒有接收到檔案:</p> <pre class="brush:php;toolbar:false;">import requests url='http://nesssi.cacr.caltech.edu/cgi-bin/getmulticonedb_release2.cgi/post' files={'files': open('file.txt','rb')} values={'upload_file' : 'file.txt' , 'DB':'photcat' , 'OUT':'csv' , 'SHORT':'short'} r=requests.post(url,files=files,data=values)</pre> <p>我將'upload_file'關鍵字的值填入了我的檔名,因為如果我留空,它會顯示:</p> <pre class="brush:php;toolbar:false;">錯誤 - 您必須選擇一個要上傳的檔案! </pre> <p>現在我得到了:</p> <pre class="brush:php;toolbar:false;">檔案 file.txt 的大小為 bytes,上傳成功! 查詢服務結果:共有 0 行。 </pre> <p>這只有在文件為空時才會出現。所以我不知道如何成功發送我的文件。我知道文件是有效的,因為如果我手動填寫表單並訪問這個網站,它會返回一個很好的匹配對象列表,這正是我想要的。我真的很感謝所有的提示。 </p> <p>一些相關的其他線程(但沒有解決我的問題):</p> <ul> <li>使用Python腳本透過POST傳送檔案</li> <li>http://docs.python-requests.org/en/latest/user/quickstart/#response-content</li> <li>使用requests上傳檔案並傳送額外資料</li> <li>http://docs.python-requests.org/en/latest/user/advanced/#body-content-workflow</li> </ul><p><br /></p>
P粉071559609
P粉071559609

全部回覆(2)
P粉422227023

(2018) 新的Python requests函式庫簡化了這個過程,我們可以使用 'files' 變數來表示我們要上傳一個多部分編碼的檔案

url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}

r = requests.post(url, files=files)
r.text
P粉590428357

如果upload_file是指文件,請使用:

files = {'upload_file': open('file.txt','rb')}
values = {'DB': 'photcat', 'OUT': 'csv', 'SHORT': 'short'}

r = requests.post(url, files=files, data=values)

然後requests將發送一個多部分錶單POST請求體,其中upload_file欄位設定為file.txt檔案的內容。

檔案名稱將包含在特定欄位的mime頭中:

>>> import requests
>>> open('file.txt', 'wb')  # 创建一个空的演示文件
<_io.BufferedWriter name='file.txt'>
>>> files = {'upload_file': open('file.txt', 'rb')}
>>> print(requests.Request('POST', 'http://example.com', files=files).prepare().body.decode('ascii'))
--c226ce13d09842658ffbd31e0563c6bd
Content-Disposition: form-data; name="upload_file"; filename="file.txt"


--c226ce13d09842658ffbd31e0563c6bd--

請注意filename="file.txt"參數。

如果需要更多控制,可以使用元組作為files映射值,元組的長度應在2到4之間。第一個元素是檔名,其後是內容,也可以選擇性地包含內容類型頭和其他頭的對應:

files = {'upload_file': ('foobar.txt', open('file.txt','rb'), 'text/x-spam')}

這將設定一個替代檔案名稱和內容類型,省略了可選的頭。

如果您希望整個POST請求體來自檔案(沒有指定其他欄位),請不要使用files參數,直接將檔案作為data進行POST。您可能還想設定一個Content-Type頭,否則將不會設定任何頭。參見Python requests - POST data from a file

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板