微信小程序后台的HTTP API 上传文件功能

最近帮一家公司做微信小程序,同时需要帮着做后台,遇到一个上传文件的功能,其实没多难,记录一下。

我用的是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,意味着成功了呀。微信小程序后台的HTTP API 上传文件功能_第1张图片
但是同志们,不要着急复制粘贴,这是错的,因为你会发现数据库里面根本没有这张图片,错就错在我只看了开发文档的前一半,实际后面还有一部分的,才是最最重要的环节。
微信小程序后台的HTTP API 上传文件功能_第2张图片
看,还需要重新拼装一个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的编码,记得把它们转为中文。

你可能感兴趣的:(微信小程序,python)