背景
- 项目问题
项目是使用python编写程序运行在windows系统上将电脑上的媒体文件上传至存储服务端
代码里采用了表单上传的方式,存储服务端也提供了表单上传的接口,一般来说,大文件不应该通过表单去上传,但是由于编写分块上传的逻辑比较复杂,加上公司租用的电脑和服务端的网络传输是很快的,这种场景下直接使用表单上传是没问题的,1G的文件大概10分钟多些就传输完毕了。
方案
- 小文件传统上传方法
- 代码
data={}
file_name='xxxxxx'
url = 'http://xxxx'
headers = {}
files = {'file': open(file_name, 'rb')
r = requests.post(url, files=files, data=data, headers=headers)
-
流式上传方法一
需要用到使用到
requests_toolbelt
库 -
代码
from requests_toolbelt import MultipartEncoder
d={'file_size':'xxxx','file_md5':'xxxx','file_id':'xxxxx'}
file = open(file_name, 'rb')
d["file"] = (os.path.basename(file_name), file, 'application/octet-stream')
payload = MultipartEncoder(d)
r = requests.post(url, data=payload,
headers={'Content-Type': payload.content_type, },
timeout=3600)
-
缺点
需要后台支持接收表单时内存不溢出,
python tornado
后台暂时没找到方法去接收大表单内容,其他语言不知道
-
流式上传方法二
把参数放到header
里传输,把文件放到body里传输,python tornado
支持流式读取body内容 -
代码
data = {'file_size':'xxxx','file_md5':'xxxx','file_id':'xxxxx'}
filename=‘xxxxx’
storage_url = "http://xxx"
with open(filename, 'rb') as f:
res = requests.post(storage_url, headers=data, data=f)
-
缺点
不是真正的表单上传,需要和后台商定好如何解析
服务端解析代码
https://www.jianshu.com/p/b50f0c2e6542
网友评论