Search code examples
androidioshttpflutterdart

How can I download file using flutter dio?


I want to downlaod file using url with help of flutter Dio.

  final imgUrl = "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf";
  var dio = Dio();
RaisedButton.icon(
                  onPressed: (){
                    download2(dio, imgUrl, "./example/boo2.pdf");
                  },
                  icon: Icon(Icons.file_download,color: Colors.white,),
                  color: Colors.green,
                  textColor: Colors.white,
                  label: Text('Dowload Invoice')
              )


 Future download2(Dio dio, String url, String savePath) async {
    try {
      Response response = await dio.get(
        url,
        onReceiveProgress: showDownloadProgress,
        //Received data with List<int>
        options: Options(
            responseType: ResponseType.bytes,
            followRedirects: false,
            validateStatus: (status) { return status < 500; }
            ),
      );
      print(response.headers);
      File file = File(savePath);
      var raf = file.openSync(mode: FileMode.write);
      // response.data is List<int> type
      raf.writeFromSync(response.data);
      await raf.close();
    } catch (e) {
      print(e);
    }
  }

  void showDownloadProgress(received, total) {
    if (total != -1) {
      print((received / total * 100).toStringAsFixed(0) + "%");
    }
  }

i am gettng this error.

OS Error: Permission denied, errno = 13flutter


Solution

  • You can copy paste run full code below
    You need to use https://pub.dev/packages/path_provider to get Temporary Directory

    code snippet

    RaisedButton.icon(
                    onPressed: () async {
                      var tempDir = await getTemporaryDirectory();
                      String fullPath = tempDir.path + "/boo2.pdf'";
                      print('full path ${fullPath}');
    
                      download2(dio, imgUrl, fullPath);
                    },
                    icon: Icon(
                      Icons.file_download,
                      color: Colors.white,
                    ),
                    color: Colors.green,
                    textColor: Colors.white,
                    label: Text('Dowload Invoice'))
    

    working demo

    enter image description here enter image description here

    full code

    import 'package:flutter/material.dart';
    import 'package:dio/dio.dart';
    import 'package:path_provider/path_provider.dart';
    import 'dart:io';
    
    final imgUrl =
        "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf";
    var dio = Dio();
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void _incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      Future download2(Dio dio, String url, String savePath) async {
        try {
          Response response = await dio.get(
            url,
            onReceiveProgress: showDownloadProgress,
            //Received data with List<int>
            options: Options(
                responseType: ResponseType.bytes,
                followRedirects: false,
                validateStatus: (status) {
                  return status < 500;
                }),
          );
          print(response.headers);
          File file = File(savePath);
          var raf = file.openSync(mode: FileMode.write);
          // response.data is List<int> type
          raf.writeFromSync(response.data);
          await raf.close();
        } catch (e) {
          print(e);
        }
      }
    
      void showDownloadProgress(received, total) {
        if (total != -1) {
          print((received / total * 100).toStringAsFixed(0) + "%");
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                RaisedButton.icon(
                    onPressed: () async {
                      var tempDir = await getTemporaryDirectory();
                      String fullPath = tempDir.path + "/boo2.pdf'";
                      print('full path ${fullPath}');
    
                      download2(dio, imgUrl, fullPath);
                    },
                    icon: Icon(
                      Icons.file_download,
                      color: Colors.white,
                    ),
                    color: Colors.green,
                    textColor: Colors.white,
                    label: Text('Dowload Invoice')),
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.display1,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }