Flutter 中的文件下载:实现断点续传

Flutter 中的文件下载:实现断点续传

5 回复

使用flutter_downloader插件,配置后可实现断点续传。

更多关于Flutter 中的文件下载:实现断点续传的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中实现断点续传,可以使用dio库,设置optionsonReceiveProgress回调,保存已下载字节,并在重新下载时通过Range头指定起始位置。

在 Flutter 中实现断点续传,可以使用 dio 库。以下是一个简单的实现步骤:

  1. 安装 dio:在 pubspec.yaml 中添加 dio 依赖。
  2. 创建下载任务:使用 dio.DownloadOptions 设置 onReceiveProgress 回调来监控下载进度。
  3. 保存下载进度:将已下载的字节数保存到本地,以便下次继续下载。
  4. 断点续传:在下载时,通过 options.headers 设置 Range 头,从上次中断的地方继续下载。

示例代码:

import 'package:dio/dio.dart';
import 'package:path_provider/path_provider.dart';

Future<void> downloadFile(String url, String savePath) async {
  Dio dio = Dio();
  var downloadPath = (await getApplicationDocumentsDirectory()).path + savePath;
  var file = File(downloadPath);
  int startByte = await file.exists() ? await file.length() : 0;

  await dio.download(
    url,
    downloadPath,
    options: Options(headers: {"Range": "bytes=$startByte-"}),
    onReceiveProgress: (received, total) {
      print("Received: $received, Total: $total");
    },
  );
}

这样即可实现断点续传功能。

使用flutter_downloader插件,设置下载任务支持断点续传。

在 Flutter 中实现文件下载的断点续传功能,通常需要结合 httpdio 库来管理网络请求,并通过文件的本地存储来实现断点续传。下面是一个使用 dio 库实现断点续传的示例:

1. 添加依赖

首先,在 pubspec.yaml 中添加 diopath_provider 依赖:

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.0
  path_provider: ^2.0.0

2. 实现断点续传

以下是一个简单的断点续传实现:

import 'dart:io';
import 'package:dio/dio.dart';
import 'package:path_provider/path_provider.dart';

class FileDownloader {
  final Dio _dio = Dio();

  Future<void> downloadFileWithResume(String url, String fileName) async {
    final directory = await getApplicationDocumentsDirectory();
    final filePath = '${directory.path}/$fileName';

    // 检查文件是否存在并获取已下载的字节数
    int downloadedBytes = 0;
    final file = File(filePath);
    if (await file.exists()) {
      downloadedBytes = await file.length();
    }

    // 设置请求头,支持断点续传
    final response = await _dio.download(
      url,
      filePath,
      options: Options(
        headers: {
          'Range': 'bytes=$downloadedBytes-',
        },
      ),
      onReceiveProgress: (received, total) {
        if (total != -1) {
          print('已下载:${(received / total * 100).toStringAsFixed(0)}%');
        }
      },
      deleteOnError: false, // 如果下载失败,不删除文件
    );

    if (response.statusCode == 200 || response.statusCode == 206) {
      print('文件下载完成:$filePath');
    } else {
      print('文件下载失败');
    }
  }
}

3. 使用示例

在需要下载文件的地方调用 downloadFileWithResume 方法:

void downloadFile() async {
  final downloader = FileDownloader();
  await downloader.downloadFileWithResume(
    'https://example.com/largefile.zip',
    'largefile.zip',
  );
}

4. 解释

  • Range 请求头:通过在请求头中添加 Range 字段,告诉服务器从指定的字节开始下载,实现断点续传。
  • onReceiveProgress:用于监听下载进度。
  • deleteOnError:设置为 false,确保在下载失败时不会删除已下载的部分文件。

通过这种方式,你可以在 Flutter 中实现文件的断点续传功能。

回到顶部