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
在HarmonyOS 6.0的真机上运行就没有这个问题,应该是虚拟机的问题。对没有真机的开发者不太友好啊。
更多关于HarmonyOS鸿蒙Next中文件上传失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,文件上传失败可能由以下原因导致:网络连接不稳定或中断;应用权限未开启文件存储或网络访问权限;系统文件路径错误或目录不存在;服务器端配置问题如接口地址错误或限制;文件大小超出服务器限制;系统资源不足如内存或存储空间已满。检查网络状态、权限设置、文件路径及服务器配置以定位问题。
从代码和现象来看,问题可能出现在文件复制或网络传输环节。当文件超过100KB时,建议检查以下几点:
-
沙箱目录权限与空间:确保
context.cacheDir有足够空间存储临时文件,大文件可能因空间不足导致复制失败。 -
文件复制完整性:在
copyFileSync后验证目标文件大小是否与源文件一致。可添加以下检查:const srcStat = fs.statSync(fileUris[0]); const destStat = fs.statSync(destPath); if (srcStat.size !== destStat.size) { console.error("File copy incomplete"); return; } -
网络超时与配置:大文件上传需更长时间,检查
rcp.Session是否设置了足够的超时时间:const session = rcp.createSession(); session.setTimeout(30000); // 设置为30秒 -
服务器限制:确认服务器对请求体大小或单文件上传是否有限制(如Nginx的
client_max_body_size)。 -
内存管理:大文件可能触发内存限制,确保使用流式处理。当前代码已通过路径传递,但可尝试分块上传。
建议在catch块中输出详细错误信息,并检查IDE日志是否有隐藏异常。若问题仍存,可尝试用真机测试排除虚拟机性能限制。

