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

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐