在鸿蒙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上传实现。