Flutter Web:使用 Dio 上传视频时显示进度

Posted

技术标签:

【中文标题】Flutter Web:使用 Dio 上传视频时显示进度【英文标题】:Flutter Web: Show Progress while Uploading Video using Dio 【发布时间】:2021-11-28 12:17:01 【问题描述】:

我尝试从 Flutter Web 在 AWS s3 上上传视频,并且视频上传成功。但它并没有像上传多少百分比那样向我显示进度。

uploadFile(String url, Uint8List imageBytes) async 
    BaseOptions options = new BaseOptions(
        contentType: "multipart/form-data",
        headers: 
          'Access-Control-Allow-Origin': '*',
          "Access-Control-Allow-Methods": "POST,GET,DELETE,PUT,OPTIONS",
          "Access-Control-Allow-Credentials": true,
          "Access-Control-Allow-Headers": "Origin,Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,locale",
          'Accept': "*/*",
        ,
        connectTimeout: 200000,
        receiveTimeout: 200000,
        sendTimeout: 200000,
        followRedirects: true,
        validateStatus: (status) 
          print('Status: $status');
          return status <= 500;
        );

    Dio _dio = new Dio(options);

    var file = MultipartFile.fromBytes(imageBytes).finalize();

    await _dio.put(
      url,
      data: file,
      onReceiveProgress: (int sentBytes, int totalBytes) 
        double progressPercent = sentBytes / totalBytes * 100;
        print("Progress: $progressPercent %");
        if (progressPercent == 100) 
          dispose();
        
      ,
      onSendProgress: (int sentBytes, int totalBytes) 
        double progressPercent = sentBytes / totalBytes * 100;
        print("Progress: $progressPercent %");
        if (progressPercent == 100) 
          dispose();
        
      ,
    ).then((value) 
      print("response: $value.data");
      print("%%%%%%");
    ).catchError((onError) 
      print(onError);
      dispose();
    );
  

我在函数onSendProgressonReceiveProgress 中打印了日志,但它没有显示任何日志。

任何人都可以帮忙显示在 AWS 服务器上上传视频的进度吗?如果有人需要更多信息,请告诉我。

【问题讨论】:

【参考方案1】:

import 'package:dio/dio.dart' as dartio;

未来的uploadFile(Message message) async // 忽略这个。 最终 AuthenticationController authController = 获取.find();

String urlFileStore =
    (authController.state as Authenticated).currentAccount.urlFileStore;
String apiTokenFileStore = (authController.state as Authenticated)
    .currentAccount
    .apiTokenFileStore;

dartio.BaseOptions options = new dartio.BaseOptions(
    contentType: "multipart/form-data",
    headers: 'Authorization': apiTokenFileStore,
    connectTimeout: 200000,
    receiveTimeout: 200000,
    sendTimeout: 200000,
    followRedirects: true,
    validateStatus: (status) 
      _logger.wtf('uploadFile Status: $status');
      return status <= 500;
    );

dartio.Dio _dio = dartio.Dio(options);

try 
  var formData = dartio.FormData.fromMap(
    'file': await dartio.MultipartFile.fromFile(message.filePath),
  );

  var response = await _dio.post(
    urlFileStore,
    data: formData,
    onSendProgress: (int sent, int total) 
      _logger.wtf('$sent $total');
    ,
  );
  //update message object filePath
  _logger.v(response);
 on Exception catch (e) 
  _logger.e(e);

这项工作是我的,我是客人,您需要更改帖子。

【讨论】:

以上是关于Flutter Web:使用 Dio 上传视频时显示进度的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中使用 Dio 和 multi_image_picker 插件上传多张图片

flutter中dio网络get请求使用总结

Flutter Dio源码分析--Dio介绍

Flutter Dio源码分析--封装

Flutter Dio源码分析(四)--封装

Flutter Dio源码分析--深度剖析