作者:重庆互联网小徐 发布时间:2024-03-15 浏览:20604 赞(1950) 收藏 评论(0)
在服务端上传文件时,需要对文件增加元数据,以区分上传者 OpenID 和控制文件权限。若文件无元数据,则该文件将不可被小程序侧访问。
通过如下的接口,可以获取文件元数据,或对元数据进行解析得到 OpenID。
输入用户openid
,bucket
名称和上传目录,获取文件的加密元数据。
POST https://api.weixin.qq.com/_/cos/metaid/encode
body信息:
{ "openid": "exampleopenid", "bucket": "bucket", // 在「微信云托管控制台-对象存储-存储配置」获取 "paths": [ "/aaa", // 文件路径 "/bbb" ]}
返回结果如下,返回的 x_cos_meta_field_strs
的顺序与输入的顺序相同。
{ "errcode": 0, "errmsg": "ok", "respdata": { "x_cos_meta_field_strs": [ "xxx-xxx-xxxxxx", "xxx-xxx-xxxxxx" ] }}
接口 /_/cos/metaid/encode
,理论上可以生成任意存在或者不存在的文件、存储桶、openid为入参的元数据,本质上是对这些入参做了一次签名,在之后的客户端(小程序/h5)使用时,可以根据元数据推断出所属用户,并根据权限管理的设定做出读写拦截或放通。
所以你可以根据业务的自身情况,灵活的使用元数据达到期待效果。比如预先生成,重写文件的元数据改变所属人等。如果你生成的元数据跟真实的不符,无法解析或者信息不对应,统一按照未知处理;若权限在创建者可读写的情况下,只有管理端(SDK或者服务端API)可以对文件进行修改,小程序端无法操作读写。
输入加密元数据,返回用户openid
,上传目录和bucket
名称。暂仅支持解析单个 metaid,批量解析时需要注意访问频率。
POST https://api.weixin.qq.com/_/cos/metaid/decode
{ "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": [] }}
以 NodeJS SDK 为例,需要在文件的 Headers 中增加 x-cos-meta-fileid
以下是封装的上传文件方法,可参考后自行调整:
const fs = require('fs')const cosConfig = { Bucket: '', // 填写云托管对象存储桶名称 Region: 'ap-shanghai' // 存储桶地域,默认是上海,其他地域环境对应填写}/** * 封装的上传文件函数 * @param {*} cloudpath 上传的云上路径 * @param {*} filepath 本地文件路径 */async function uploadFile (cloudpath, filepath) { const authres = await call({ url: 'http://api.weixin.qq.com/_/cos/metaid/encode', method: 'POST', data: { openid: '', // 填写用户openid,管理端为空字符串 bucket: cosConfig.Bucket, paths: [cloudpath] } }) try { const auth = JSON.parse(authres) const res = await this.cos.putObject({ Bucket: cosConfig.Bucket, Region: cosConfig.Region, Key: cloudpath, StorageClass: 'STANDARD', Body: fs.createReadStream(filepath), ContentLength: fs.statSync(filepath).size, Headers: { 'x-cos-meta-fileid': auth.respdata.x_cos_meta_field_strs[0] } }) if (res.statusCode === 200) { return { code: 0, file: JSON.stringify(res) } } else { return { code: 1, msg: JSON.stringify(res) } } } catch (e) { console.log('上传文件失败', e.toString()) return { code: -1, msg: e.toString() } }}function call (obj) { return new Promise((resolve, reject) => { request({ url: obj.url, method: obj.method || 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(obj.data || {}) }, function (err, response) { if (err) reject(err) resolve(response.body) }) })}
微信云托管对象存储的底层是COS,而COS的存储桶是默认私有读写的,如果你使用COS SDK内获取对象URL方法获取的 cos.ap-shanghai.myqcloud.com
结尾的对象路径,在无 sign
参数时会显示权限拒绝的提示。
而在微信云托管控制台-对象存储里的文件路径时 tcb.qcloud.la
结尾的,这个是文件访问的另一个途径,权限是受微信云托管控制台权限管控的。
如果你想使COS SDK获取的,cos.ap-shanghai.myqcloud.com
链接公有读,可以使用权限修改接口修改COS存储桶的权限。(在这里列举的PHP链接,其他语言请自行查找)
微信云托管内对象存储底层的COS存储桶,没有暴露任何控制台界面,所以想对COS桶进行设置,需要通过SDK或API完成。
我们写了一个DEMO,使用 sharp 将上传的图片全部转成webp格式,并返回webp格式的链接。
服务的上传下载直接使用的为COS-SDK,可以做有价值的参考。
项目仓库:github
重庆互联网项目从2004年开始为各行各业提供互联网发展解决方案,专业从事网站、小程序、微信公众号、APP、电商平台、系统等互联网平台开发,帮助企业实现从传统行业到互联网的完美转型。截止目前,重庆互联网合作的企业遍布全国各地,19年的开发经验和完善的售后服务体系获得合作客户的高度认可!
关注重庆互联网官方公众号,即可获取粉丝专享福利!
欢迎广大用户为此页面进行评价,评价成功将获得积分奖励!