之前公司的移动端项目都是使用阿里云的OSS对象存储,最近公司开发鸿蒙版的APP,对于这部分的功能还是准备使用OSS ,但是阿里云并没有提供相关的sdk ,只提供了一个临时性的解决方案:阿里云OSS客户端直传
实现这个功能的前提条件是必须有服务端支撑,需要服务端请求阿里云接口获取临时上传所需的参数,然后返回给客户端,再由客户端发起提交。
阿里云一共提供了三种方式, 最开始服务端给我提供的是第三种,但是经过一番折腾,这一条路没有走通。偶然在鸿蒙社区发现了一个帖子使用第二种方式成功,然后赶紧让服务端改为提供第二种方式,经过一番调试,最终上传成功了。社区中的帖子
第二种方式是使用表单的方式提交数据,把服务器端返回的参数组装到表单对象中
let formData: Array<http.MultiFormData> = [ { name: 'name', contentType: 'text/plain', data: fileName }, { name: 'policy', contentType: 'text/plain', data: resultObj['policy'] }, { name: 'OSSAccessKeyId', contentType: 'text/plain', data: resultObj['ossAccessKeyId'] }, { name: 'success_action_status', contentType: 'text/plain', data: '200' }, { name: 'signature', contentType: 'text/plain', data: resultObj['signature'] }, { name: 'key', contentType: 'text/plain', data: resultObj['dir'] + fileName }, { name: 'file', contentType: 'text/plain', filePath: newPath, remoteFileName: fileName } ],
这里有一个问题需要注意, 就是鸿蒙设备不支持直接把从相册中获取到的文件路径进行上传,需要转换成沙箱路径后才能提交成功
let path = filesPath const resFile = fileIo.openSync(path, fileIo.OpenMode.READ_ONLY) let fileName = '' if (name == undefined) { filesPath = resFile.name } else { fileName = name } let newPath = context.cacheDir + "/" + fileName fileIo.copyFileSync(resFile.fd, newPath)