从url下载文件,保存到手机存储

baw*_*wsi 24 file download flutter

我正在处理一个项目,该项目要求我从 URL 下载文件,一旦点击按钮,并将其存储到手机存储(可能是下载文件夹)。

关于如何做到这一点的任何想法?正在下载的文件也不总是相同的,可以是从图像到 pdf 的任何文件。

wes*_*tdb 20

使用https://pub.dartlang.org/packages/flutter_downloader。不要忘记进行平台配置。

基本上,这就是您应该如何使用该软件包。链接中有一个详细的长示例。

final taskId = await FlutterDownloader.enqueue(
  url: 'your download link',
  savedDir: 'the path of directory where you want to save downloaded files',
  showNotification: true, // show download progress in status bar (for Android)
  openFileFromNotification: true, // click on notification to open downloaded file (for Android)
);
Run Code Online (Sandbox Code Playgroud)

编辑:有人说上面的包维护得很好。试试这个 https://pub.dev/packages/flowder

  • 这个包充满了问题! (4认同)

Jit*_*ude 15

static var httpClient = new HttpClient();
Future<File> _downloadFile(String url, String filename) async {
  var request = await httpClient.getUrl(Uri.parse(url));
  var response = await request.close();
  var bytes = await consolidateHttpClientResponseBytes(response);
  String dir = (await getApplicationDocumentsDirectory()).path;
  File file = new File('$dir/$filename');
  await file.writeAsBytes(bytes);
  return file;
}
Run Code Online (Sandbox Code Playgroud)

  • 什么都没发生... (3认同)

小智 6

FlutterChina 的 Dio 似乎是要走的路。https://github.com/flutterchina/dio/。它很强大,并为您提供检索下载/上传进度的选项


小智 6

如果您想从没有外部库的 URL 下载和保存文件,您可以使用此代码。它对我有用,但我不检查大文件。祝你好运。

Future<String> downloadFile(String url, String fileName, String dir) async {
        HttpClient httpClient = new HttpClient();
        File file;
        String filePath = '';
        String myUrl = '';
    
        try {
          myUrl = url+'/'+fileName;
          var request = await httpClient.getUrl(Uri.parse(myUrl));
          var response = await request.close();
          if(response.statusCode == 200) {
            var bytes = await consolidateHttpClientResponseBytes(response);
            filePath = '$dir/$fileName';
            file = File(filePath);
            await file.writeAsBytes(bytes);
          }
          else
            filePath = 'Error code: '+response.statusCode.toString();
        }
        catch(ex){
          filePath = 'Can not fetch url';
        }
    
        return filePath;
      }
Run Code Online (Sandbox Code Playgroud)

对于Android,请不要忘记在清单文件中添加这些行,否则构建apk后它将无法在真机上运行:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)