HarmonyOS RCP文件上传问题?

使用RCP进行文件上传,服务端那边没有任何响应结果,不知道该如何排查这个问题?

阅读 543
1 个回答

可以参考以下demo:

import { rcp } from '@kit.RemoteCommunicationKit';
import { picker } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';
import fs from '@ohos.file.fs';

function testRcpMultiPartUpload(uris: Array<string>): void {
  //根据uri获取文件对象
  let file = fs.openSync(uris[0], fs.OpenMode.READ_ONLY)
  console.log("文件对象:" + file)
  console.log("文件路径:" + uris[0])
  //获取文件状态
  let stat = fs.statSync(file.fd)
  //根据文件长度创建一个ArrayBuffer对象
  let buf = new ArrayBuffer(stat.size)
  //打印文件长度
  console.log("文件长度:" + stat.size);
  //读取文件
  //fs.readSync是Node.js中fs模块提供的同步读取文件的方法。
  //它返回一个整数值,表示实际读取到的字节数。
  // 如果读取失败,它会抛出一个错误
  // 如果读取成功,它会将读取到的数据存储到指定的Buffer对象中。
  fs.readSync(file.fd, buf)
  console.log("文件转换二进制数组:" + buf)
  // 设置请求头
  let headers: rcp.RequestHeaders = { "content-type": 'multipart/form-data' };
  // 创建一个session会话
  let session = rcp.createSession();
  let multiFormFieldValue = buildMultipartFormFieldValue(file.name, buf, 'image/jpeg');
  //new一个multiForm对象
  let multiForm = new rcp.MultipartForm({ multiFormFieldValue });
  //发送请求
  let req = new rcp.Request('http://127.0.0.1:9588/upload/image', "POST", headers, multiForm);
  session.fetch(req).then((response) => {
    console.log("请求返回:" + response)
  }).catch(() => {
    console.log("请求失败:" + JSON.stringify(req))
  }).finally(() => {
    session.close();
  });
}

function buildMultipartFormFieldValue(fileName: string, pathOrContent: string | ArrayBuffer, contentType: string): rcp.MultipartFormFieldValue {
  let result: rcp.MultipartFormFieldValue = {
    remoteFileName: fileName,
    contentType: contentType,
    //传文件二进制内容或者是文件的路径
    contentOrPath: { content: pathOrContent }
  }
  return result;
}

@Entry
@Component
struct Index {
  @State uris: Array<string> = []; // 全局变量保存图库选择的结果uri
  // 接口采用promise异步返回形式,传入可选参数DocumentSelectOptions对象,返回选择文件的uri数组。
  async getFileAssetsFromType() {
    const photoSelectOptions = new picker.PhotoSelectOptions(); // 创建图片-音频类型文件-预览的图库选项实例
    // 选择媒体文件类型和选择媒体文件的最大数目
    photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; // 选择媒体文件类型为Image
    photoSelectOptions.maxSelectNumber = 2; // 选择媒体文件的最大数目
    // 创建图库选择器实例,调用photoViewPicker.select()接口拉起图库界面进行文件选择,文件选择成功后,返回photoSelectResult结果集。
    const photoViewPicker = new picker.PhotoViewPicker();
    photoViewPicker.select(photoSelectOptions)
      .then((photoSelectResult) => {
        // select返回的uri权限是只读权限,需要将uri写入全局变量@State中即可进行读取文件数据操作。
        this.uris = photoSelectResult.photoUris;
      }).catch((err: BusinessError) => {
      return;
    })
  }

  build() {
    Row() {
      Column() {
        Text("点击选择图片").fontSize(50).fontWeight(FontWeight.Bold)
          .height("20%")
          .onClick(() => {
            this.getFileAssetsFromType()
          })
        Text("点击上传文件").fontSize(50).fontWeight(FontWeight.Bold)
          .height("20%")
          .onClick(() => {
            testRcpMultiPartUpload(this.uris)
          })
      }.width('100%')
    }.height('100%')
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进