flutter 文件下载及存储路径


前言

日常开发中,经常会遇到下载文件的功能,往往我们在需要保存文件的路径上去调试,比如Android中的路径,有些会报错在SD卡中,但是有些手机,又没有SD卡,那么我们该怎么办呢?


一、下载进度条

为了功能的完善,往往需要一个下载的进度条,当然,UI怎么美化不管,核心代码如下:

Container(
        padding: EdgeInsets.symmetric(horizontal: 32.w),
        height: Get.height,
        alignment: Alignment.center,
        child: Obx(
          () => Container(
            decoration: BoxDecoration(
              borderRadius: BorderRadius.all(
                Radius.circular(4.r),
              ),
              color: Colors.white,
            ),
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                Padding(
                  padding: EdgeInsets.only(top: 22.h, bottom: 4.h),
                  child: Text(
                    '发送文件',
                    style: TextStyles.normalTextStyle(
                      fontSize: 17.sp,
                      fontWeight: FontWeight.w500,
                    ),
                  ),
                ),
                Container(
                  width: Get.width,
                  padding:
                      EdgeInsets.only(right: 24.w, left: 24.w, bottom: 12.h),
                  child: Column(
                    children: [
                      Padding(
                        padding: EdgeInsets.only(
                          top: 8.h,
                          bottom: 12.h,
                        ),
                        child: Text(
                          controller.scheduleLoad.value != '100'
                              ? '文件正在下载中,请稍候'
                              : '文件已下载完成',
                          style: TextStyles.normalTextStyle(
                            fontSize: 14.sp,
                            color: Colours.textGrey9,
                          ),
                        ),
                      ),
                      InkWell(
                        onTap: controller.scheduleLoad.value == '100'
                            ? () {
                                shareDialog(title);
                              }
                            : null,
                        child: Container(
                          height: 74.h,
                          alignment: Alignment.center,
                          child: SizedBox(
                            height: 40.h,
                            child: Stack(
                              children: [
                                ClipRRect(
                                  borderRadius:
                                      BorderRadius.all(Radius.circular(20.r)),
                                  child: SizedBox(
                                    height: 40.h,
                                    child: LinearProgressIndicator(
                                      value: double.tryParse(
                                          controller.scheduleLoad.value),
                                      backgroundColor: Colours.blueBtnBg02,
                                      valueColor: const AlwaysStoppedAnimation(
                                        Colors.blue,
                                      ),
                                    ),
                                  ),
                                ),
                                Center(
                                  child: Text(
                                    controller.scheduleLoad.value != '100'
                                        ? "下载进度${controller.scheduleLoad.value}%"
                                        : '分享文件',
                                    textAlign: TextAlign.center,
                                    style: TextStyles.normalTextStyle(
                                      color: Colors.white,
                                      fontSize: 14.sp,
                                    ),
                                  ),
                                ),
                              ],
                            ),
                          ),
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ),
      )

上面的代码中,定义了一个视图,用来展示下载进度的信息,这里我使用的是getx 的状态管理,直接使用Obx进行下载数据的实时监听刷新。

二、文件路径

首先我们需要传入一个文件的下载路径,然后使用三方插件path_provider来获取文件的路径。

    if (filePath != null) {
      String? docPath;
      if (Platform.isAndroid) {
        docPath = "/storage/emulated/0/Download/";
        Directory dir = Directory(docPath);
        try {
           dir.listSync();
        }catch (e){
          // 一些系统没有权限
          docPath = (await getExternalStorageDirectory())?.path;
          docPath = '$docPath/';
        }
      } else {
        docPath = (await getTemporaryDirectory()).path;
        docPath = docPath.replaceFirst("Library/Caches", "Documents/");
      }
      loadFilePath = '$docPath$name.docx';
    }

上面的代码中,docPath 定义的一个路径,字面意思就是模拟器中的外部下载文件路径,但是在有些手机中,没有外部SD卡,那么我们再获取一下当前设备的内部SD卡路径, (await getTemporaryDirectory()).path, 其实getTemporaryDirectory 字面意思也是获取的外部存储路径,但是在没有外部SD卡的时候,他会获取内部的存储路径。

二、文件上传

文件上传部分,直接使用Dio 中封装好的方法就行

      await Dio()
          .download(filePath, loadFilePath, onReceiveProgress: (int received, int total) {
        if (total != -1) {
          scheduleLoad.value = (received / total * 100).toStringAsFixed(0);
        }
      });

到此为止,整个文件的下载保存功能就做完了,可以直接在手机的下载文件目录中查看下载的文件


总结

请添加图片描述

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 Flutter 中,可以使用 `path.extension` 函数来取得路径文件的扩展名。例如: ``` import 'package:path/path.dart' as path; String filePath = '/path/to/file.txt'; String fileExtension = path.extension(filePath); print(fileExtension); // '.txt' ``` 注意,在使用 `path.extension` 函数之前,需要在文件头部引入 `path` 包。 希望这能帮到你! ### 回答2: 在Flutter中获取文件的扩展名可以使用Dart的path库来实现。首先需要引入path库,可以在项目的pubspec.yaml文件中的dependencies中添加path库的依赖。然后在需要获取文件扩展名的地方,使用path库中的extension方法即可。 具体步骤如下: 1. 在pubspec.yaml文件的dependencies中添加path库的依赖: ``` dependencies: path: ^1.8.0 ``` 2. 在需要获取文件扩展名的地方引入path库: ``` import 'package:path/path.dart' as path; ``` 3. 使用extension方法获取文件的扩展名: ``` String filePath = "路径/文件名.扩展名"; String extension = path.extension(filePath); print(extension); // 输出文件的扩展名,例如:.jpg、.txt等 ``` 上述代码中,filePath是文件路径文件名,通过调用path.extension方法即可获取文件的扩展名,并将结果存储在extension变量中。 需要注意的是,path.extension方法返回的扩展名是以“.”开头的字符串,例如“.jpg”、“.txt”,所以在使用时可能需要根据具体情况进行进一步处理。同时还需要注意文件路径的格式,保证传入的路径参数是一个有效的文件路径。 这就是在Flutter中获取文件扩展名的方法。通过使用Dart的path库,我们可以轻松取得路径文件的扩展名。 ### 回答3: 在Flutter中,要获取路径文件的扩展名,可以使用Dart的path包中的extension()方法。 首先,需要在Dart文件的开头导入path包,代码如下: ```dart import 'package:path/path.dart' as path; ``` 然后,可以使用extension()方法来获取路径文件的扩展名。假设有一个文件路径为`/path/to/file.txt`,代码如下: ```dart String filePath = '/path/to/file.txt'; String extension = path.extension(filePath); print(extension); // 输出:.txt ``` 在以上代码中,我们将文件路径存储在`filePath`变量中,然后使用`path.extension()`方法来获取文件的扩展名,将结果存储在`extension`变量中。最后,通过打印`extension`变量,我们可以看到文件的扩展名为`.txt`。 需要注意的是,`path.extension()`方法会返回文件路径中最后一个`.`字符之后的所有字符,包括`.`字符本身。如果文件路径中没有`.`字符,或者`.`字符位于文件路径的最后一个字符位置,则返回一个空字符串。 此外,在使用`path.extension()`方法之前,还需要确保已经安装了path包,并在Dart文件中导入了path包的依赖。可以在pubspec.yaml文件中添加dependencies配置,然后运行`flutter pub get`命令来安装依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半身风雪

感谢打赏,你的鼓励,是我创作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值