HarmonyOS 鸿蒙Next中request.uploadFile上传文件成功,但是并无服务器数据返回。
HarmonyOS 鸿蒙Next中request.uploadFile上传文件成功,但是并无服务器数据返回。
在使用`request.uploadFile`上传相册选中的图片时,进行了沙箱处理,上传看似也成功了,但是没有我方服务器的返回数据。
```typescript
async upFile(uri: Array<string>) {
JLog.d("原图:::" + uri[0])
let header = new Map<Object, string>();
header.set('Content-Type', 'multipart/form-data');
let segments = uri[0].split('/')
let fileName = segments[segments.length - 1]
let realUri = this.context.cacheDir + "/" + fileName
JLog.d("沙箱图处理:::realUri:" + realUri)
try {
let file = fs.openSync(uri[0])
fs.copyFileSync(file.fd, realUri)
} catch (err) {
JLog.e('err.code : ' + err.code + ', err.message : ' + err.message)
}
let files: Array<request.File> = [{
filename: fileName,
name: "file",
uri: `internal://cache/${fileName}`,
type: 'jpg'
}]
let data: Array<request.RequestData> = [{
name: 'TenantID',
value: 'ysz'
}, {
name: 'file',
value: 'files'
}];
let uploadConfig: request.UploadConfig = {
url: ApiUrl.UPLOAD_IMAGE_URL,
header: header,
method: 'POST',
files: files,
data: data
}
try {
let context = getContext(this) as common.UIAbilityContext;
request.uploadFile(context, uploadConfig)
.then((uploadTask: request.UploadTask) => {
uploadTask.on('complete', (taskStates: Array<request.TaskState>) => {
for (let i = 0; i < taskStates.length; i++) {
JLog.d(`upload complete taskState: ${JSON.stringify(taskStates[i])}`);
}
});
uploadTask.on("progress", (size, tot) => {
JLog.d("进度" + size + '/' + tot)
})
})
.catch((err: BusinessError) => {
JLog.e(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
})
} catch (error) {
let err: BusinessError = error as BusinessError;
JLog.e(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
}
}
打印部分日志:
原图:::file://media/Photo/8/IMG_1715853988_003/IMG_20240516_180448.jpg
沙箱图处理:::realUri:/data/storage/el2/base/haps/entry/cache/IMG_20240516_180448.jpg
进度3647696/3647696
upload complete taskState: {"path":"/data/storage/el2/base/haps/entry/cache/IMG_20240516_180448.jpg","responseCode":0,"message":""}
更多关于HarmonyOS 鸿蒙Next中request.uploadFile上传文件成功,但是并无服务器数据返回。的实战教程也可以访问 https://www.itying.com/category-93-b0.html
uploadTask.on(“headerReceive”, (headers:object)
在这个方法中可以接受服务器返回的数据
[@ohos.request (上传下载)-数据文件处理-ArkTS API-Basic Services Kit(基础服务)-基础功能-系统 - 华为HarmonyOS开发者](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-request-V5#onheaderreceive7)
on(‘headerReceive’)7+
on(type: ‘headerReceive’, callback: (header: object) => void): void
订阅上传任务HTTP标头事件,异步方法,使用callback形式返回结果。
需要权限:ohos.permission.INTERNET
系统能力: SystemCapability.MiscServices.Upload
可以参考开启on(‘headerReceive’),其中响应体的 header 和 body 都会在这个 header object 里存放
[@ohos.request (上传下载)-数据文件处理-ArkTS API-Basic Services Kit(基础服务)-基础功能-系统 - 华为HarmonyOS开发者](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-request-V5#onheaderreceive7)
更多关于HarmonyOS 鸿蒙Next中request.uploadFile上传文件成功,但是并无服务器数据返回。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,使用request.uploadFile上传文件成功但无服务器数据返回,可能原因如下:
-
服务器未正确响应:服务器可能未返回数据或返回的数据格式不符合预期。需检查服务器端逻辑,确保正确处理上传请求并返回响应。
-
请求配置问题:检查
request.uploadFile的配置,特别是success回调函数中是否正确处理了返回数据。确保在success回调中有处理响应的逻辑。 -
网络问题:网络请求可能成功,但由于网络波动或延迟,响应数据未及时返回。检查网络连接是否稳定。
-
跨域问题:如果服务器与客户端存在跨域问题,可能导致响应数据被浏览器拦截。确保服务器配置允许跨域请求。
-
接口文档问题:确认上传接口的文档,确保上传成功时服务器应返回数据。某些接口可能仅返回状态码而不返回数据。
-
日志记录:在服务器端和客户端添加日志记录,检查上传请求的处理过程,找出数据未返回的具体原因。
-
权限问题:服务器可能对上传请求有权限限制,导致数据未返回。检查服务器端的权限设置。
-
数据格式问题:服务器返回的数据格式可能不符合预期,导致客户端无法解析。检查返回数据的格式是否符合接口文档要求。
通过以上步骤排查,可以找到上传成功但无服务器数据返回的具体原因。
在HarmonyOS鸿蒙Next中,request.uploadFile成功上传文件但无服务器数据返回,可能原因包括:
- 服务器未正确响应:检查服务器端是否处理了上传请求并返回了响应。
- 回调函数问题:确保
success回调函数正确实现,检查是否有错误处理逻辑。 - 网络问题:确认网络连接正常,上传过程中未中断。
- 文件大小或类型限制:检查服务器是否对文件大小或类型有限制。
- 调试信息:使用
console.log或调试工具查看上传过程中的详细日志。
建议逐步排查以上问题,确保上传流程完整且服务器正确响应。

