您现在的位置是:首页 >其他 >【小程序】微信云托管服务端文件上传网站首页其他
【小程序】微信云托管服务端文件上传
简介【小程序】微信云托管服务端文件上传
访问方式:
- 云调用API方式
- COS-SDK方式
API 方式上传文件
- 获取文件上传连接
- 上传文件数据
注意:
- 上传文件时,body格式multipart/form-data
获取文件上传链接
POST https://api.weixin.qq.com/tcb/uploadfile?access_token=ACCESS_TOKEN
请求参数(JSON)
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
access_token/cloudbase_access_token | string | 是 | 接口调用凭证 | |
env | string | 是 | 云环境ID | |
path | string | 是 | 上传路径 |
{
"env": "werun—id",
"path": "web/test.zip"
}
返回值(JSON):
属性 | 类型 | 说明 |
---|---|---|
errcode | number | 错误码 |
errmsg | string | 错误信息 |
url | string | 上传url |
token | string | token |
authorization | string | authorization |
file_id | string | 文件ID |
cos_file_id | string | cos文件ID |
{
"errcode": 0,
"errmsg": "ok",
"url": "https://cos.ap-shanghai.myqcloud.com/8888-werun-id-1300000000/web/test.zip",
"token": "cbl3vhld2EFYnNHa0ndCvDrmd24d6GPa9",
"authorization": "q-sign-algorithm=sha1&q-ak=AKIDFnbuKfk_qeIIhWcEFWN",
"file_id": "cloud://werun-id.8888-werun-id-1300000000/web/test.zip",
"cos_file_id": "HIqJeJmHDQoHMIlxshGWJR2mdCaaJZ96bxm=="
}
上传文件数据
用户获取到返回数据后,需拼装一个 HTTP POST 请求,其中 url 为返回包的 url 字段,Body 部分格式为 multipart/form-data:
key | value | 说明 |
---|---|---|
key | this/is/a/example/file.path | 请求包中的 path 字段 |
Signature | q-sign-algorithm=sha1&q-ak=AKID9… | 返回数据的 authorization 字段 |
x-cos-security-token | Cukha70zkXIBqkh1Oh… | 返回数据的 token 字段 |
x-cos-meta-fileid | HDze32/qZENCwWi5… | 返回数据的 cos_file_id 字段。必填,否则看似上传成功的文件下载时会报错,只能删除重传。 |
file | 文件内容 | 文件的二进制内容 |
// 采用了Spring RestTemplate实现post请求
public static String doPostFormData(String url,MultiValueMap<String, Object> data){
try {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
//头部类型
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
//构造实体对象
HttpEntity<MultiValueMap<String, Object>> param = new HttpEntity<>(data, headers);
//发起请求,服务地址,请求参数,返回消息体的数据类型
ResponseEntity<String> response = restTemplate.postForEntity(url, param, String.class);
return response.getBody();
}catch (Exception ex){
logger.error("doPostFormData",ex);
}
return "";
}
// 上传文件数据,返回fileID
private String uploadFileData(String path,JSONObject json,byte[] data){
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("key",path);
map.add("Signature",json.get("authorization"));
map.add("x-cos-security-token",json.get("token"));
map.add("x-cos-meta-fileid",json.get("cos_file_id"));
map.add("file",data);
String result = doPostFormData(json.get("url").toString(),map);
System.out.println("request result:" + result);
return jsonObject.get("file_id").toString() // File ID
}
COS-SDK方式
- 使用开放接口服务获取临时密钥。
- 使用临时密钥初始化COS-SDK
- 使用COS-SDK做增删改查等操作。
- 上传文件时,需要使用开放接口服务获取文件元数据,保证小程序端可以访问。
所需开放接口服务:
- 获取临时密钥:
http://api.weixin.qq.com/_/cos/getauth
- 文件元数据:
https://api.weixin.qq.com/_/cos/metaid/encode
- 元数据解析:
https://api.weixin.qq.com/_/cos/metaid/decode
注意:
- 使用SDK上传文件时需要上传文件元数据,否则小程序不可访问
获取临时密钥
对象存储提供的临时秘钥角色可以访问当前环境下的存储桶。
GET http://api.weixin.qq.com/_/cos/getauth
{
"TmpSecretId": "", // 临时密钥的 tmpSecretId
"TmpSecretKey": "", // 临时密钥的 tmpSecretKey
"Token": "", // 临时密钥的 sessionToken
"ExpiredTime": "" // 临时密钥失效时间戳,是申请临时密钥时,时间戳加 durationSeconds
}
获取文件元数据
POST https://api.weixin.qq.com/_/cos/metaid/encode
请求参数(json):
{
"openid": "exampleopenid",
"bucket": "bucket", // 在「微信云托管控制台-对象存储-存储配置」获取
"paths": [
"/aaa", // 文件路径
"/bbb"
]
}
返回结果(json):
{
"errcode": 0,
"errmsg": "ok",
"respdata": {
"x_cos_meta_field_strs": [
"xxx-xxx-xxxxxx",
"xxx-xxx-xxxxxx"
]
}
}
解析文件元数据
POST https://api.weixin.qq.com/_/cos/metaid/decode
请求参数(json):
{
"metaid": "xxx-xxx-xxxxxx"
}
{
"errcode": 0,
"errmsg": "ok",
"respdata": {
"raw_data": {
"openid": "exampleopenid",
"bucket": "bucket",
"appid": "exampleappid",
"path": "/aaa",
"mpAppId": "exampleappid"
},
"x_cos_meta_field_strs": []
}
}
使用元数据上传文件
需要在文件的 Headers 中增加 x-cos-meta-fileid
问题
COS-SDK上传的文件小程序无法访问
根据官方文档说明,通过COS-SDK上传文件时,需要获取文件元数据,否则无法上传成功后,小程序不能访问。
问题:元数据获取空
待补充
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。