在鸿蒙Next(HarmonyOS NEXT)中,实现multipart/form-data上传需要使用multipartbody.part来构建请求体。以下是具体实现步骤和示例代码:
1. 添加网络权限
在module.json5中添加权限:
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
}
]
}
}
2. 创建MultipartBody.Part
import http from '@ohos.net.http';
import fileIo from '@ohos.file.fs';
// 创建文本字段Part
function createFormField(name: string, value: string): http.MultipartBody.Part {
return http.MultipartBody.Part.createFormDataPart(name, value);
}
// 创建文件字段Part
async function createFilePart(name: string, filePath: string): Promise<http.MultipartBody.Part> {
let file = await fileIo.open(filePath, fileIo.OpenMode.READ_ONLY);
let fileStat = await fileIo.stat(filePath);
return http.MultipartBody.Part.createFilePart(
name,
file,
fileStat.size,
'image/jpeg' // 根据实际文件类型修改
);
}
3. 构建请求并执行上传
async function uploadMultipart() {
let httpRequest = http.createHttp();
// 创建MultipartBody
let multipartBody = new http.MultipartBody([
await createFormField('description', '示例文件'),
await createFilePart('file', 'path/to/your/file.jpg')
]);
try {
let response = await httpRequest.request(
'https://your-upload-url.com/upload',
{
method: http.RequestMethod.POST,
header: {
'Content-Type': 'multipart/form-data'
},
extraData: multipartBody
}
);
console.log('Response:', response.result);
} catch (error) {
console.error('Upload failed:', error);
} finally {
httpRequest.destroy();
}
}
关键点说明:
- 使用
MultipartBody.Part.createFormDataPart创建文本字段
- 使用
MultipartBody.Part.createFilePart创建文件字段
- 文件需要先通过
fileIo.open打开获取FD(文件描述符)
- 必须正确设置Content-Type为multipart/form-data
- 文件上传完成后会自动关闭文件流
注意事项:
- 确保文件路径有效且具有读取权限
- 根据实际文件类型设置正确的MIME类型
- 大文件上传建议使用分块上传方式
- 在生产环境中需要添加进度回调和处理错误
这样就完成了鸿蒙Next中的multipart上传实现。