flutter file_picker dio web端上传记录

这篇具有很好参考价值的文章主要介绍了flutter file_picker dio web端上传记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

app端的上传 获取到FilePickerResult 对象 里面包含 选择上传的文件信息

 FilePickerResult? result = await FilePicker.platform.pickFiles(

      allowMultiple: true,

    );

app端上传逻辑

final allLength = file?.count ?? 0;
int curUploadLength = 0;
// 文件为空
for (var path in file!.paths) {
  final res =
      await Api.uploadFile(path as String);
  final String httpPath = res["data"] ?? "";
  imgList.add(httpPath);
  curUploadLength++;
  widget.onChange?.call(imgList);
}
setState(() {
  cruProgress = curUploadLength / allLength;
});

setState(() {
  isUploading = false;
});

api上传

  static uploadFile(
    String path, {
    ProgressCallback? onSendProgress,
  }) async {
    FormData formData =
        FormData.fromMap({'file': await MultipartFile.fromFile(path)});
    final res = await dio.post(
      Url.uploadFile,
      data: formData,
      options: Options(
        method: "post",
        contentType: "multipart/form-data",
      ),
      onSendProgress: onSendProgress,
    );
    return res.data;
  }

 

其中file.count 表示上传的文件数量

file.paths 表示 选择文件的路径数组

通过dio 上传  使用FormData 进行转载

 Global.isWeb  == kIsWeb

web端上传报错: 不能使用file.paths 来上传文件

修改如下

web 使用 dio 和 file_picker 上传需要处理

获取 file_picker 的 PlatformFile 对象是一致的 ,在点击文件上传的时候进行逻辑处理

if (kIsWeb) {
final allLength = file?.count ?? 0;
int curUploadLength = 0;
print(file);
// 文件为空
for (PlatformFile curFile in file!.files) {
  final res =
      await Api.uploadFilePlatformFile(curFile);
  final String httpPath = res["data"] ?? "";
  imgList.add(httpPath);
  curUploadLength++;
  widget.onChange?.call(imgList);
}

Console.d("上传 click $allLength");
setState(() {
  cruProgress = curUploadLength / allLength;
});

setState(() {
  isUploading = false;
});

web端的api


  static uploadFilePlatformFile(
    PlatformFile file, {
    ProgressCallback? onSendProgress,
  }) async {
    List<int> fileBytes = file.bytes!;
    MultipartFile multipartFile =
        MultipartFile.fromBytes(fileBytes, filename: file.name);
    FormData formData = FormData.fromMap({'file': multipartFile});
    final res = await dio.post(
      Url.uploadFile,
      data: formData,
      options: Options(
        method: "post",
        contentType: "multipart/form-data",
      ),
      onSendProgress: onSendProgress,
    );
    return res.data;
  }

最关键的问题 

 List<int> fileBytes = file.bytes!;

file.bytes 返回的是 Uint8List  需要转成  List<int> 才行  不然 虽然文件通过FormData 发送给后端了 但是后端一直拿不到数据。

完整组件代码文章来源地址https://www.toymoban.com/news/detail-813481.html

// 文件上传

import 'package:LS/common/index.dart';
import 'package:LS/gen/assets.gen.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';

class MoreFileUploadWidget extends StatefulWidget {
  final Function(List<String?>)? onChange;
  const MoreFileUploadWidget({
    super.key,
    this.onChange,
  });

  @override
  State<MoreFileUploadWidget> createState() => _MoreFileUploadWidgetState();
}

class _MoreFileUploadWidgetState extends State<MoreFileUploadWidget> {
  FilePickerResult? file;

  double cruProgress = 0;

  bool isUploading = false;

  List<String> imgList = [];

  Future getFile() async {
    setState(() {
      imgList.clear();
      cruProgress = 0;
      isUploading = false;
    });

    FilePickerResult? result = await FilePicker.platform.pickFiles(
      allowMultiple: true,
    );

    file = result;
    setState(() {});
  }

  Widget addContainer() {
    return InkWell(
      child: Container(
        width: 108.w,
        height: 108.w,
        alignment: Alignment.center,
        decoration: BoxDecoration(
          color: const Color(0xffF4F6F8),
          borderRadius: BorderRadius.circular(5.r),
        ),
        child: Assets.icon.addImage.image(width: 34.w),
      ),
      onTap: () async {
        await getFile();
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return file == null
        ? addContainer()
        : LayoutBuilder(
            builder: (BuildContext context, BoxConstraints constraints) {
              final width = (constraints.maxWidth - 30) / 2;

              return Wrap(
                spacing: 30,
                runSpacing: 30,
                children: [
                  for (final name in file!.names)
                    Container(
                      width: width,
                      decoration: BoxDecoration(
                        color: Colors.white,
                        borderRadius: BorderRadius.circular(8.r),
                      ),
                      child: Text(
                        (name as String).tr,
                        style: TextStyle(
                          fontSize: 12.sp,
                          fontWeight: FontWeight.bold,
                        ),
                      ),
                    ),
                  addContainer(),
                  if (isUploading)
                    Text(
                      "上传中...".tr,
                      style: TextStyle(
                        fontSize: 12.sp,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  if (file?.names != null && file!.names.isNotEmpty)
                    LineProgressWidget(
                      cruProgress: cruProgress,
                    ),
                  if (file?.names != null &&
                      file!.names.isNotEmpty &&
                      cruProgress != 1)
                    Center(
                      child: PrimaryBtn(
                        text: "上传",
                        onTap: () async {
                          if (isUploading) {
                            return;
                          }
                          Console.d("上传 click");
                          setState(() {
                            isUploading = true;
                          });

                          if (Global.isWeb) {
                            final allLength = file?.count ?? 0;
                            int curUploadLength = 0;
                            print(file);
                            // 文件为空
                            for (PlatformFile curFile in file!.files) {
                              final res =
                                  await Api.uploadFilePlatformFile(curFile);
                              final String httpPath = res["data"] ?? "";
                              imgList.add(httpPath);
                              curUploadLength++;
                              widget.onChange?.call(imgList);
                            }

                            Console.d("上传 click $allLength");
                            setState(() {
                              cruProgress = curUploadLength / allLength;
                            });

                            setState(() {
                              isUploading = false;
                            });
                          } else {
                            try {
                              final allLength = file?.count ?? 0;
                              int curUploadLength = 0;
                              // 文件为空
                              for (var path in file!.paths) {
                                final res =
                                    await Api.uploadFile(path as String);
                                final String httpPath = res["data"] ?? "";
                                imgList.add(httpPath);
                                curUploadLength++;
                                widget.onChange?.call(imgList);
                              }
                              setState(() {
                                cruProgress = curUploadLength / allLength;
                              });

                              setState(() {
                                isUploading = false;
                              });
                            } catch (e) {
                              Console.d("错误 $e");
                              setState(() {
                                isUploading = false;
                              });
                            }
                          }
                        },
                      ),
                    ),
                ],
              );
            },
          );
  }
}

到了这里,关于flutter file_picker dio web端上传记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用uni-file-picker上传文件(图片)到腾讯云存储COS步骤

    微信小程序上传文件到腾讯云存储COS: 准备步骤: 1.拿到腾讯云的API密钥:在API密钥管理中获取SecretId和SecretKey,没有的话生成一个 2.开通COS存储创建存储桶,需要拿到存储桶名字和所在地域 3.打开对象存储的产品文档进入SDK文档里的小程序SDK里面有源码下载地址 主要是为了

    2024年02月07日
    浏览(46)
  • uni-file-picker上传图片到后端服务器并存入数据库

    最近在做一个需求,使用uniapp上传用户头像。后端会有一个处理上传图片返回图像链接的接口。在uniapp官网关于上传的组件有两个: (1)uni.uploadFile(object) (2)uni-file-picker 如果使用uni.uploadFile,前端的代码大致可以这样写: 这是官网给出的范例。对应的HTML: 然后就是 自

    2024年02月12日
    浏览(44)
  • uni-ui 中 uni-file-picker组件限制用户上传大小超过大小自动去除

    uni-ui 中 uni-file-picker组件限制用户上传大小超过大小自动去除 找到该组件位置打开uni-file-picker 在props中添加自己想起的名字绑定限制大小 找到chooseFileCallback方法插入代码: 其他页面调用即可

    2024年01月15日
    浏览(59)
  • uniapp中的uni-file-picker组件上传多张图片到服务器,可添加,预览,删除图片

    前言:在uniapp官方文档中的uni-file-picker组件可实现图片上传功能,官方文档:uniapp官网 中的案例不能完全满足需求,官网中默认的是上传到自带的服务空间 以下是代码: view代码: :auto-upload=\\\"false\\\"加上这个取消自动上传 methods方法 选择图片 上传图片 删除图片 上传事例: 参

    2024年02月11日
    浏览(57)
  • uni-app uni-file-picker文件上传实现拍摄从相册选择获取图片上传文档服务器(H5上传-微信小程序上传)

    前言 最近在使用uni-app写H5移动端,有一个从手机拍摄从相册选择获取图片上传到文档服务器功能。 查阅uni-app发现关于上传图片,uni-file-picker文件上传,uni.chooseImage,uni.uploadFile H5上传时它和pc端原理差不多,都是file对象上传,PC端是通过new file对象,uni-app是直接提供了 微信

    2024年02月15日
    浏览(88)
  • Flutter之dio请求封装

    dio是一个http请求库,功能十分强大,支持Restful API、请求取消、FormData、拦截器等,下面我们对dio进行简单的封装,这样我们在项目中使用时会更顺手,这里还需要配合AndroidStudio的 jsonToDartBeanAction插件配合使用 打开我们的flutter的项目的pubspec.yaml 文件,然后在dependencies 中添加依

    2024年02月14日
    浏览(44)
  • flutter dio 请求封装(空安全)

    2024年02月06日
    浏览(58)
  • Flutter Dio 库的简单封装

    dio 库Flutter 中是比较流行的网络请求库。 其中在拦截器可以拦截请求,响应以及错误 权限验证:比如接口请求后端返回401未授权时可以跳到登录页,403跳到未授权页面; 异常监控:可以在拦截器处理异常,并且上报到异常监控后台或者发送异常预警消息; 缓存接口:可以对

    2024年02月11日
    浏览(53)
  • Flutter之Dio封装+实例(自己梳理)

    https://github.com/cfug/dio/blob/main/dio/README-ZH.md  手动添加到pubspec.yaml: 在终端使用以下命令: dio 是一个强大的 HTTP 网络请求库,支持全局配置、Restful API、FormData、拦截器、 请求取消、Cookie 管理、文件上传/下载、超时、自定义适配器、转换器等。 单例模式详见:Flutter之单例模式

    2024年02月08日
    浏览(90)
  • Flutter 使用 dio 遇到的问题合集

    泪流满面啊,,,,, 1. postHttpLogin-异常-----DioException [bad response]: The request returned an invalid status code of 500. 2. post请求失败 DioException [bad response]: The request returned an invalid status code of 415. 这个问题有些离谱,415,415都说是请求头的问题,但结果却不是

    2024年02月03日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包