HarmonyOS 鸿蒙Next App上传文件问题

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

HarmonyOS 鸿蒙Next App上传文件问题

就是我按照axios文档 上传 他就给我 error:Error: the parameters check fails   Parameter verification failed, Parse config files error

2 回复

打开文件然后转成ArrayBuffer 的,参考文档:https://gitee.com/openharmony-sig/ohos_axios#当上传的内容为arraybuffer时用法如下 先把相册的URL通过文件打开的方式读取到cache下面,再通过axios上传url的方式上传

 let file = fs.openSync(uri, fs.OpenMode.CREATE);
          // 复制文件到缓存目录下
          fs.copyFileSync(file.fd, cacheDir + '/test.jpeg')

推荐用url的,你看看能不能运行,修改你的代码:

import { common, Permissions } from '@kit.AbilityKit';
import { showToastMessage } from '../utils/CommonUtils';
import { picker } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';
import Logger from '../utils/Logger';
import permissionUtils from '../utils/PermissionUtils';
import axios, { AxiosError, AxiosResponse, FormData } from '@ohos/axios';
import fs from '@ohos.file.fs';

const permissions: Array<Permissions> = ['ohos.permission.READ_MEDIA', 'ohos.permission.WRITE_MEDIA',
  'ohos.permission.MEDIA_LOCATION'];

const TAG = 'MainPage';
// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let cacheDir = context.cacheDir;
@Entry
@Component
@Preview
struct Index {
  @State message: string = 'Hello World';
  @State uri: Resource | string | undefined = $r('app.media.foreground');
  @State netContent: string = ""
  @State localContent: string = ""

  build() {
    Stack({ alignContent: Alignment.Center }) {
      Column() {
        //touxiang
        Image(this.uri).width('100lpx').height('100lpx')
        Button('从相册取一张').width('100%').onClick(() => {
          const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
          permissionUtils.requestPermissions(context, permissions,
            (allGranted: boolean, onGranted: Array<Permissions>, onDenied: Array<Permissions>) => {
              if (allGranted) {
                let array: string[];
                try {
                  let PhotoSelectOptions = new picker.PhotoSelectOptions();
                  PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
                  PhotoSelectOptions.maxSelectNumber = 1;
                  let photoPicker = new picker.PhotoViewPicker();
                  photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult) => {
                    Logger.info(TAG,
                      'PhotoViewPicker.select successfully, PhotoSelectResult uri: ' +
                      JSON.stringify(PhotoSelectResult));
                    if (PhotoSelectResult !== null && PhotoSelectResult !== undefined) {
                      array = PhotoSelectResult['photoUris'];
                      array.forEach((value) => {
                        //选的相片的URI
                        let file = fs.openSync(value, fs.OpenMode.CREATE);
                        // 复制文件到缓存目录下
                        fs.copyFileSync(file.fd, cacheDir + '/test.jpg')
                        this.uploadImg('internal://cache/test.jpg')
                      })
                    }
                  }).catch((err: BusinessError) => {
                    Logger.error(TAG, 'PhotoViewPicker.select failed with err: ' + JSON.stringify(err));
                  });
                } catch (err) {
                  Logger.error(TAG, 'PhotoViewPicker failed with err: ' + err);
                }
              } else {
                showToastMessage("权限" + allGranted + onGranted + onDenied)
              }
            })
        })
        Text('upload 的 try catch 日志').width('100%').fontWeight(700)
        Text(this.localContent).width('100%')
        Text('网络的 的 日志').width('100%').fontWeight(700)
        Text(this.netContent).width('100%')
      }
    }
    .height('100%')
    .width('100%')
  }

  uploadImg(uri: string) {
    //uri转ArrayBuffer
    let formData = new FormData()
    try {
      formData.append('file', 'internal://cache/test.jpg')
      axios.post<string, AxiosResponse<string>, FormData>('https://appv2test.cnrmall.com/membercenter/v2/upload/uploadPic',
        formData, {
          headers: { 'Content-Type': 'multipart/form-data' },
          context: getContext(this),
        }).then((res: AxiosResponse<string>) => {
        this.uri = uri;
        showToastMessage("成功上传" + JSON.stringify(res.data))
        this.netContent = JSON.stringify(res.data)
        console.info("gwl result" + JSON.stringify(res.data));
      }).catch((err: AxiosError) => {
        showToastMessage("上传失败" + JSON.stringify(err))
        this.netContent = JSON.stringify(err)
        console.error("gwl error:" + JSON.stringify(err));
      })
    } catch (err) {
      this.localContent = JSON.stringify(err)
      console.info('err:' + JSON.stringify(err));
    }
  }
}

针对HarmonyOS 鸿蒙Next App上传文件问题,以下是一些可能的解决方案:

  1. 配置权限

    • 确保在module.json5配置文件中已添加ohos.permission.INTERNET网络权限声明,以允许应用执行网络请求。
  2. 选择文件

    • 使用文件选择器API让用户从本地选择文件,并获取文件的路径和内容。
  3. 构建请求

    • 使用HttpRequest或类似的网络请求库构建包含文件数据的POST请求,注意设置正确的Content-Type,通常为multipart/form-data
  4. 发送请求

    • 将构建好的请求发送到服务器,并处理服务器的响应。
  5. 检查与调试

    • 确保应用已正确配置网络权限。
    • 验证文件路径是否正确,鸿蒙系统的文件系统可能与Android或iOS有所不同。
    • 检查服务器响应,分析响应码和错误信息以确定上传失败的具体原因。
    • 使用调试工具和日志记录来跟踪上传过程中的问题,以便进行故障排除。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部