HarmonyOS 鸿蒙Next uploadFromFile试用错误

发布于 1周前 作者 caililin 来自 鸿蒙OS

HarmonyOS 鸿蒙Next uploadFromFile试用错误

试用rcp的api uploadFromFile上传文件 代码如下:

let uploadFromFile : rcp.UploadFromFile = { fileOrPath : uploadFilePath }  

return new Promise((resolve, reject) => { this.session.uploadFromFile(this.assembleFullUrl(uploadPath, params), uploadFromFile) .then((resp)=>{ if (resp.statusCode == 200) { const temp: WMHttpResponse<T> = resp.toJSON() as WMHttpResponse<T>; console.debug(temp.code:${temp.code}) console.debug(temp.error:${temp.error}) console.debug(temp.message:${temp.message}) console.debug(temp.data:${temp.data}) if (temp.code == this.successCode) { resolve(temp) } else { reject(temp) } } else { let temp: WMHttpResponse<T> = resp.toJSON() as WMHttpResponse<T>; if (temp != null) { reject(temp) } else { let message: string | null = ‘no error message’; if (resp.toString() != null) { message = resp.toString(); } temp = this.dealWithError(message!); temp.code = resp.statusCode reject(temp) } } })  request错误

怎么搞

2 回复

打印信息服务器返回错误码500,文件上传除此之外也可以采用@ohos.request (上传下载):https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-request-V5

下面是rcp文件上传示例:

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%')

  }

}

可以看下这个接口的定义:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/remote-communication-rcp-V5#section1753162618375

针对您提到的HarmonyOS鸿蒙系统中Next uploadFromFile试用错误的问题,这通常可能涉及文件路径错误、权限不足、文件格式不支持或API使用不当等几种常见原因。

  1. 文件路径验证:请确保提供的文件路径正确无误,且该文件在指定路径下确实存在。使用绝对路径而非相对路径,以避免路径解析错误。

  2. 权限检查:确认您的应用已正确声明并获得了读取该文件所需的权限。在HarmonyOS中,这通常需要在config.json文件中声明相关权限。

  3. 文件格式支持:检查uploadFromFile方法是否支持您尝试上传的文件格式。某些API可能对文件类型有特定要求。

  4. API使用正确性:仔细阅读HarmonyOS官方文档,确保Next uploadFromFile的使用方式符合API规范,包括参数传递、回调处理等。

  5. 日志与异常捕获:增加日志输出,捕捉并分析异常信息,这有助于定位问题所在。

如果以上步骤均无法解决问题,可能是系统级问题或特定环境下的异常。此时,建议直接联系官网客服以获取更专业的技术支持。官网地址是:https://www.itying.com/category-93-b0.html

回到顶部