搜尋

首頁  >  問答  >  主體

如何使用Python的requests庫上傳檔案?

<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粉071559609P粉071559609454 天前606

全部回覆(2)我來回復

  • P粉422227023

    P粉4222270232023-08-17 12:40:36

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

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

    回覆
    0
  • P粉590428357

    P粉5904283572023-08-17 11:32:38

    如果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

    回覆
    0
  • 取消回覆