HarmonyOS鸿蒙Next中ohos/httpclient如何实现大文件的MultiPart/form-data文件流上传

HarmonyOS鸿蒙Next中ohos/httpclient如何实现大文件的MultiPart/form-data文件流上传 三方库版本:@ohos/httpclient@2.0.4

操作步骤:

  1. 视频文件, 大概300M
  2. 使用multipart/form-data 上传
  3. 监控上传进度
  4. 获取返回上传后的返回数据(比如文件的url地址)

目前采用官方的案例,需要读取文件到内存. 看能否提供基于文件流上传的MultiPart/form-data

// buffer 实际是读到内存的
const buffer = new ArrayBuffer()
let part = RequestBody.create(buffer,
     new Mime.Builder()
       .contentDisposition(`form-data; name="buffer";filename="test.mp4"`)
       .contentType('video/mp4')
       .build()
       .getMime())

let multiPart: MultiPart = new MultiPart.Builder()
  .type(MultiPart.FORMDATA)
  .addPart(part)
  .build()
let body: RequestBody = multiPart.createRequestBody();
let request: Request = new Request.Builder()
  .url('http://www.baidu.com/upload') // 此处需要替换成实际上传服务器
  .post(body)
  .headers(headers) // 上传时headers
  .addHeader('Content-Type', 'multipart/form-data')
  .addHeader('connection', 'keep-alive')
  .build()

const client = new HttpClient.Builder()
   .setConnectTimeout(60, TimeUnit.SECONDS)
   .setReadTimeout(60, TimeUnit.SECONDS)
   .setWriteTimeout(60, TimeUnit.SECONDS).build()
   client.newCall(request).execute().then(response => {
   response.uploadTask.on('progress', (uploadedSize: number, totalSize: number) => {
       console.log('Di-', 'progress--->uploadedSize: ' + uploadedSize + ' ,totalSize--->', totalSize);
       if (uploadedSize == totalSize) {
         console.log('Di-', '上传成功' )
       }
     })
     response.uploadTask.on('headerReceive', (headers: object) => {
       console.log('Di-', 'progress--->uploadSize: ' + JSON.stringify(headers));
       const body = headers['body']
       console.log('Di-', 'body--->', body)
     })
})

更多关于HarmonyOS鸿蒙Next中ohos/httpclient如何实现大文件的MultiPart/form-data文件流上传的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中ohos/httpclient如何实现大文件的MultiPart/form-data文件流上传的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用ohos/httpclient实现大文件的MultiPart/form-data文件流上传,可以通过以下步骤完成:

  1. 创建HttpClient实例: 使用HttpClient.create()方法创建一个HttpClient实例。

  2. 构建MultipartEntity: 使用MultipartEntityBuilder构建一个包含文件和其他表单数据的MultipartEntity。可以通过addBinaryBody方法添加文件,addTextBody方法添加文本字段。

  3. 设置请求头: 在请求头中设置Content-Typemultipart/form-data,并指定boundary。

  4. 执行请求: 使用HttpRequest对象设置请求方法为POST,并将MultipartEntity设置为请求体。然后通过HttpClient.execute()方法执行请求。

  5. 处理响应: 获取响应对象HttpResponse,并处理响应状态码和响应体。

示例代码如下:

import http from '@ohos.net.http';
import fileio from '@ohos.fileio';

let httpClient = http.createHttp();

let filePath = 'path/to/your/largefile'; // 文件路径
let fileStream = fileio.createStream(filePath, 'r');

let multipartEntity = http.MultipartEntityBuilder.create()
    .addBinaryBody('file', fileStream, 'application/octet-stream', 'largefile')
    .addTextBody('field1', 'value1')
    .build();

let request = http.createHttpRequest({
    method: http.RequestMethod.POST,
    url: 'https://example.com/upload',
    header: {
        'Content-Type': 'multipart/form-data; boundary=' + multipartEntity.getBoundary()
    },
    entity: multipartEntity
});

httpClient.execute(request, (err, response) => {
    if (err) {
        console.error('Error:', err);
    } else {
        console.log('Response status:', response.responseCode);
        console.log('Response body:', response.result);
    }
});
回到顶部