记录 OpenHarmony 使用 request.uploadFile 时踩的坑

开发环境

  • 设备环境:OpenHarmony 4.1.x
  • SDK 版本:API 10
  • 开发模型:Stage 模型
  • IDLE: Dev Eco 4.1

官方文档

踩坑一:后台服务地址

上传文件依赖后台服务器,如果使用本地搭建的服务,是无法访问的,还没试过修改 hosts 文件是否可以。否则就会出现如下错误

img

但是为了方便调试,我还是本地开了一个服务,但是我使用内网穿透工具将本地服务代理到公网,然后使用公网域名实现的调试

踩坑二:api 参数

UploadConfig 上传文件的参数错一个都不行!

里面有个本地文件上传路径,官方文档也写的比较模糊,这个路径可以通过 context.cacheDir 来获得,

代码语言:javascript
复制
let uploadConfig: request.UploadConfig = {
url: url, //需要手动替换为真实服务器地址
header: {
'Content-Type': 'multipart/form-data',
},
method: http.RequestMethod.POST,
files: [
{
filename: "biLog.zip",
name: "file",
uri: internal://cache/biLog.zip, // 这里路径必须用 cache 路径,官方文档这么要求的
type: "zip"
},
],
data: [{
name: "file", value: "file"
}],
};

踩坑三; 如何获取后台返回的结果

这里 鸿蒙没有直接把结果返回到 body 中,而是把结果放到了 header 中获取

代码语言:javascript
复制
      try {
request.uploadFile(context, uploadConfig).then((data: request.UploadTask) => {
uploadTask = data;

      uploadTask.on('headerReceive', headerCallback);  // 2 , 返回的结果会在 header 中拿到数据
      uploadTask.on('progress', upProgressCallback);  // 1
      uploadTask.on('complete', upCompleteCallback);  // 3
      uploadTask.on('fail', upFailCallback);  // 3

    }).catch((err: BusinessError) => {
      console.log(TAG, `upload Failed to request the upload. Code: ${err.code}, message: ${err.message}`);
      if (callback) {
        callback("error", err);
      }
    });
  } catch (err) {
    console.log(TAG, `upload Failed to request the upload. err: ${JSON.stringify(err)}`);
    if (callback) {
      callback("error", err);
    }
  } finally {

  }
}</code></pre></div></div><p>​</p>