1. 程式人生 > >python上傳大圖時以base64形式導致引數過長,後端遲遲接收不到請求

python上傳大圖時以base64形式導致引數過長,後端遲遲接收不到請求

上傳大圖這個問題,斷斷續續困擾了一個月今天終於解決了!!撒花~

下圖裡base64_data是經過轉換的,型別是str

f = open(origin_path, 'rb')
base64_data = base64.b64encode(f.read()).decode('utf-8')

name就是圖片的名稱,這個圖是之前的寫法。

以上這種方式對於1M左右的小圖可以正常操作,但稍大一些的圖就會花費很長很長時間,期間試過設定Tomcat的mastPostSize,Mysql的my.ini裡也修改過一些size引數,重啟電腦之後沒什麼用。

查詢過程中發現了Poster,但是這個Poster好像對於Python3的支援不是很好,裡面有很多東西都是Python2的,所以繼續找其它方法,之後發現一個上傳大檔案時需要的Multipart/form-data引數,但是在上圖的headers中加上

'Content-Type': 'multipart/form-data'

也不好使,後臺返回物件定義未找到。再繼續查詢,最終發現了MutipartEncoder

首先匯入這個模組,我在Pycharm裡搜尋不到requests_toolbelt,直接在cmd裡pipi install requests_toolbelt,不用指定路徑,會自動安裝到python安裝路徑下.參考網上的使用方式,我寫出了以下程式碼內容

boundary不是很清楚它的作用,看了網上對它的解釋也還不是很明白,嘗試著註釋它發現好像對專案的正常執行沒有什麼影響,於是就不使用這個boundary了。

有一點需要注意的是,Fields裡的引數需要是str,如果直接寫

"unifile_status":1

不給1加上引號,會報int物件沒有encode屬性的錯。

另外headers['content-type'] = multipart_encoder.content_type其實就是在給headers里加上multipart/form-data引數(不知道為什麼直接寫到headers裡卻不行)

至此,百M左右的檔案也能很快傳輸完成了!