前言
后端用的是 Rails ActiveStorage direct_upload 的处理方式, 前端被要求:
提供文件的 MD5-Base64 校验值, 获得上传地址;
将文件上传到上述指定地址 (此处会校验文件的 MD5-Base64 值是否与上一步给的一致);
将文件的 signed_id 作为文件参数.
相关知识
因为目前开发任务重且紧, 暂时略过此部分, 只记录结论要点, 后续有时间再补充相关知识
要点小结
3.0 上传文件 (后端 Rails: activeStorage)
Step 1: 计算文件 MD5-Base64 Encoded 摘要
小程序中前端无法获取文件的 Binary 格式, 因此无法自行或使用第三方库来计算文件的 MD5 值, 但幸运的是, 小程序也提供了 API 来做这件事, 请使用: wx.getFileInfo
将获得的 MD5 值转为 Base64 格式. 此处严重注意, 不能把 MD5 当作字符串去编码为 Base64 格式, 而应该编码为 Hex, 再编码为 Base64. 可使用 CryptoJS 库, 另外需要注意的是, CryptoJS.enc.Base64.stringify 需要的参数是 WordArray 格式, 而通过 CryptoJS.enc.Hex.parse 转换后的正好是其所需要的参数格式.
此步骤问题见此处
Step 2: 上传文件到上一步返回的指定 direct_upload 地址
小程序前端无法直接获得文件的 Binary 格式传给后端, 但可以通过 wx.uploadFile 上传文件, 通过此接口发送请求, 后端可获取到文件 Binary 格式
若小程序端使用 wx.uploadFile 上传文件, 后端提供的上传文件接口需符合 wx.uploadFile 的要求, 即请求方式为 POST, 并指定所需文件 key 名 (而不是直接要求把 Binary 文件丢在请求 body 中)
由于后端表示使用的是第三方亚马逊的服务, 无法修改接口, 因此, 小程序端要寻找其他方式获取文件 Binary 上传, 所幸在小程序提供的文件管理器中找到方法可以获取文件 Binary, 方法为 FileSystemManager.readFile(Object), API 文档点击此处查看
使用 FileSystemManager.readFile(Object) 的时候, 不要指定 encoding, 以默认 ArrayBuffer 的格式获取文件内容, 这样服务器那边拿到文件算出的 Base64 Encoded MD5 才能与前端传过去的一致. 若指定 encoding 为 binary, 则接口返回结果表示: 接收到的文件计算出的 Base64 Encoded MD5 与前端这边所发送的不一致, 校验不通过. 看起来服务端那边要的文件格式, 是 ArrayBuffer 格式, 而非 binary 编码的文件.
来源: https://www.2cto.com/kf/201906/811783.html