之前公司的移动端项目都是使用阿里云的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)

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐