我想將文件上傳到Web服務器。從我讀過的,最好的方法是在HTTP POST請求上使用multipart/form-data編碼類型。Python - HTTP multipart/form-data POST請求
我的研究似乎表明,沒有簡單的方法來使用Python標準庫來完成此操作。我使用Python 3
(注:看到一個名爲requests(PyPI Link)來輕鬆地完成這個包)
我目前使用這種方法:
import mimetypes, http.client
boundary = 'wL36Yn8afVp8Ag7AmP8qZ0SA4n1v9T' # Randomly generated
for fileName in fileList:
# Add boundary and header
dataList.append('--' + boundary)
dataList.append('Content-Disposition: form-data; name={0}; filename={0}'.format(fileName))
fileType = mimetypes.guess_type(fileName)[0] or 'application/octet-stream'
dataList.append('Content-Type: {}'.format(fileType))
dataList.append('')
with open(fileName) as f:
# Bad for large files
dataList.append(f.read())
dataList.append('--'+boundary+'--')
dataList.append('')
contentType = 'multipart/form-data; boundary={}'.format(boundary)
body = '\r\n'.join(dataList)
headers = {'Content-type': contentType}
conn = http.client.HTTPConnection('http://...')
req = conn.request('POST', '/test/', body, headers)
print(conn.getresponse().read())
本工程以發送文本。
有兩個問題:這只是文本,整個文本文件必須作爲一個巨大的字符串存儲在內存中。
如何上傳任何二進制文件?有沒有辦法做到這一點,而無需將整個文件讀入內存?
你應該使用你已經提到的請求包。有很多東西不是由標準庫處理的,比如會話管理,認證,檢查SSL證書......你不使用請求模塊的原因是什麼? – Achim
您可以將代碼從請求模塊中複製出來,然後執行您所需的操作。 – User
這當然是你的決定。但是如果我可以選擇打包高質量,經過充分測試的「使命證明」,......圖書館或我自己的自定義代碼,我總是會選擇第一個。 ;-) – Achim