HarmonyOS鸿蒙Next中文件上传失败

HarmonyOS鸿蒙Next中文件上传失败 IDE版本:DevEco Studio 6.0.0 Release

“targetSdkVersion”: “6.0.0(20)”

“compatibleSdkVersion”: “5.1.0(18)”

运行环境:IDE里面的虚拟机 图片

代码:比较简单,就是选择后上传

// 导入必要模块
import { rcp } from '@kit.RemoteCommunicationKit';
import { picker } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import fs from '@ohos.file.fs';

// 上传功能实现
async function uploadFile(context: common.UIAbilityContext) {
  try {
    // 1.创建文件选择器
    const documentPicker = new picker.DocumentViewPicker(context);
    const selectOptions = new picker.DocumentSelectOptions();
    selectOptions.maxSelectNumber = 1; // 限制单选

    // 2.调起文件选择器
    const fileUris = await documentPicker.select(selectOptions);
    if (fileUris.length === 0) return;

    // 3.将文件复制到沙箱目录
    const srcFile = fs.openSync(fileUris[0], fs.OpenMode.READ_ONLY);
    const destPath = `${context.cacheDir}/upload_temp_file`;
    fs.copyFileSync(srcFile.fd, destPath);
    fs.closeSync(srcFile);

    // 4.构建MultipartForm
    const formData = new rcp.MultipartForm({
      "file": {
        contentType: 'application/octet-stream',
        contentOrPath: destPath // 使用沙箱路径
      },
      "extraField": "custom_data" // 其他表单字段
    });

    // 5.创建会话并发送请求
    const session = rcp.createSession();
    const response = await session.post('http://***.**.**.***/upload', formData);

    console.log('Upload success:', response.toJSON());
  } catch (err) {
    console.error('Upload failed:', JSON.stringify(err));
  }
}

@Entry
@Component
struct Index {
  private context = this.getUIContext().getHostContext() as common.UIAbilityContext;
  @State message: string = 'Hello World';

  build() {
    Button('选择文件并上传')
      .onClick(() => {
        uploadFile(this.context);
      })
  }
}

现象:

传输小于100KB的文件可以正常上传,大于100KB后就会失败,服务器拿不到文件

服务器打印日志:上面是47kb的文件,下面是250kb的文件

图片

使用postman可以正常上传大文件,代码中小文件也可以上传,也没有什么报错

是否有大佬知道是什么原因


更多关于HarmonyOS鸿蒙Next中文件上传失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

在HarmonyOS 6.0的真机上运行就没有这个问题,应该是虚拟机的问题。对没有真机的开发者不太友好啊。

更多关于HarmonyOS鸿蒙Next中文件上传失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,文件上传失败可能由以下原因导致:网络连接不稳定或中断;应用权限未开启文件存储或网络访问权限;系统文件路径错误或目录不存在;服务器端配置问题如接口地址错误或限制;文件大小超出服务器限制;系统资源不足如内存或存储空间已满。检查网络状态、权限设置、文件路径及服务器配置以定位问题。

从代码和现象来看,问题可能出现在文件复制或网络传输环节。当文件超过100KB时,建议检查以下几点:

  1. 沙箱目录权限与空间:确保context.cacheDir有足够空间存储临时文件,大文件可能因空间不足导致复制失败。

  2. 文件复制完整性:在copyFileSync后验证目标文件大小是否与源文件一致。可添加以下检查:

    const srcStat = fs.statSync(fileUris[0]);
    const destStat = fs.statSync(destPath);
    if (srcStat.size !== destStat.size) {
      console.error("File copy incomplete");
      return;
    }
    
  3. 网络超时与配置:大文件上传需更长时间,检查rcp.Session是否设置了足够的超时时间:

    const session = rcp.createSession();
    session.setTimeout(30000); // 设置为30秒
    
  4. 服务器限制:确认服务器对请求体大小或单文件上传是否有限制(如Nginx的client_max_body_size)。

  5. 内存管理:大文件可能触发内存限制,确保使用流式处理。当前代码已通过路径传递,但可尝试分块上传。

建议在catch块中输出详细错误信息,并检查IDE日志是否有隐藏异常。若问题仍存,可尝试用真机测试排除虚拟机性能限制。

回到顶部