python流式上传方式

背景

  • 项目问题

项目是使用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

你可能感兴趣的:(python流式上传方式)