【小程序】微信云托管服务端文件上传

官方文档

访问方式:

  • 云调用API方式
  • COS-SDK方式

API 方式上传文件

  1. 获取文件上传连接
  2. 上传文件数据

注意:

  • 上传文件时,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方式

官方

  1. 使用开放接口服务获取临时密钥。
  2. 使用临时密钥初始化COS-SDK
  3. 使用COS-SDK做增删改查等操作。
  4. 上传文件时,需要使用开放接口服务获取文件元数据,保证小程序端可以访问。

所需开放接口服务:

  • 获取临时密钥: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上传文件时,需要获取文件元数据,否则无法上传成功后,小程序不能访问。

问题:元数据获取空

待补充

你可能感兴趣的:(※开发之旅※,小程序,微信云托管,服务端)