最近帮一家公司做微信小程序,同时需要帮着做后台,遇到一个上传文件的功能,其实没多难,记录一下。
我用的是python语言后台,就简单的把实现原理说一下。
我看了微信小程序开发文档,上面是这么说的:
按照文档所说,提交信息…
# 构建url
url = 'https://api.weixin.qq.com/tcb/uploadfile?access_token=' + get_access_token.access_token()
# 待提交的数据
data = {
"env": my_database, # 这是我的云开发环境的名称
"path": 'D:\test.jpg'
}
res = requests.post(url, data=json.dumps(data)).json()
print(res)
我们看一看,这些代码返回了什么数据,我看到返回信息里面有 ‘errcode’ : 0,意味着成功了呀。
但是同志们,不要着急复制粘贴,这是错的,因为你会发现数据库里面根本没有这张图片,错就错在我只看了开发文档的前一半,实际后面还有一部分的,才是最最重要的环节。
看,还需要重新拼装一个POST请求,格式要求multipart/form-data,按照上面的要求,我们再继续拼装一个请求:
res= requests.post(url, data=json.dumps(data)).json() # 刚才请求返回的数据
file = {"file": open('D:\test.jpg', "rb")}
url = res['url']
key = 'D:\test.jpg'
signature = res['authorization']
x_cos_security_token = res['token']
x_cos_meta_fileid = res['cos_file_id']
data = {
'key': key,
'Signature': signature,
'x-cos-security-token': x_cos_security_token,
'x-cos-meta-fileid': x_cos_meta_fileid
}
requests.post(url, data=data, files=file)
完美解决哈哈哈,但是我一打开云数据库,图片虽然是有了,但是发现另一个很尴尬的问题就是,我忘了配置存储路径了,后来发现,原来文档中所说的path和key不是待上传文件的路径,而是你需要存储的路径,经过第二次调整,终于配置好了,奉上完整代码
import requests
import json
import datetime
# 获取当前时间,用做文件的命名,防止重复命名
time = str(datetime.datetime.now().strftime('%Y%m%d%H%M%S'))
img_url='D:/test.jpg' # 待上传的文件
access_token = get_access_token.access_token() # 获取access_token
url1 = 'https://api.weixin.qq.com/tcb/uploadfile?access_token=' + access_token
data = {
"env": self.database,
"path": 'demo/'+ time+'.'+img_url.split('.')[-1] # 保证相同的文件格式
}
res = requests.post(url1, data=json.dumps(data)).json()
file = {"file": open(img_url, "rb")}
data = {
'key': 'demo/'+ time+'.'+img_url.split('.')[-1],
'Signature':res['authorization'],
'x-cos-security-token':res['token'],
'x-cos-meta-fileid': res['cos_file_id']
}
requests.post(res['url'], data=data, files=file)
经过这么一折腾,就大功告成啦,还有一个小小的问题,就是如果你用中文做云文件的名称,会出现/u的编码,记得把它们转为中文。