flutter_downloader: Path is not taking as given and downloading in Download folder only

I am getting issues while downloading videos from the server. I had given the path for Android as (/storage/emulated/0/Movies/MyApp) but It’s downloading video in the “Download” folder only.

Here is my code:

requestDownloadFile(String link, bool isShare) async {
    _permissionReady = await _checkPermission();

    if (_permissionReady) {
      FlutterDownloader.registerCallback(callback);

      var _directory = Platform.isAndroid ? Directory('/storage/emulated/0/Movies/MyApp') : await getApplicationDocumentsDirectory();

      String newPath = _directory.absolute.path;

      print("Absolute Path: $newPath");

      if(Platform.isIOS) {
        newPath += '/MyApp';
      }
      _directory = Directory(newPath);

      bool hasExisted = await _directory.exists();
      if (!hasExisted) {
        _directory.create();
      }

      _localPath = _directory.path;

      print(_localPath);

      String fileName = link.split('/').last;

      print(fileName);

      print(_localPath + '/' + fileName);

      String localFilePath = _localPath + '/' + fileName;

      if (await File(localFilePath).exists() && isShare) {
        Share.shareFiles([localFilePath]);
      } else {
        ReceivePort _port = ReceivePort();
        IsolateNameServer.registerPortWithName(_port.sendPort, 'downloader_send_port');

        streamSubscription = _port.listen((dynamic data) {
          DownloadTaskStatus status = data[1];
          if (status.value == 3) {
            print(fileName);
            print('Downloaded Path: ${_localPath + ' / ' + fileName}');
            streamSubscription.cancel();
            IsolateNameServer.removePortNameMapping('downloader_send_port');

            // Share only if clicked on share otherwise download
            if (isShare) Share.shareFiles([_localPath + '/' + fileName]);
          }
        });

        print('Path Before Downloading: $_localPath');
        await FlutterDownloader.enqueue(url: link, savedDir: _localPath, showNotification: true, openFileFromNotification: true, fileName: fileName);
      }
    }
  }

Here are the logs:

I/flutter (25574): Absolute Path: /storage/emulated/0/Movies/MyApp
I/flutter (25574): Directory: '/storage/emulated/0/Movies/MyApp'
I/flutter (25574): /storage/emulated/0/Movies/MyApp
I/flutter (25574): gbUG2Ag6LHA4UGoyG2agOeV6Uu03Thn8RVcsTu1Q.mp4
I/flutter (25574): /storage/emulated/0/Movies/MyApp/gbUG2Ag6LHA4UGoyG2agOeV6Uu03Thn8RVcsTu1Q.mp4
I/flutter (25574): Path Before Downloading: /storage/emulated/0/Movies/MyApp

D/DownloadWorker(25574): DownloadWorker{url=https://example.com/gbUG2Ag6LHA4UGoyG2agOeV6Uu03Thn8RVcsTu1Q.mp4,filename=gbUG2Ag6LHA4UGoyG2agOeV6Uu03Thn8RVcsTu1Q.mp4,savedDir=/storage/emulated/0/Movies/MyApp,header=,isResume=false

But after downloading its printing (from the library) as below:

D/DownloadWorker(25574): File downloaded (/storage/emulated/0/Download/gbUG2Ag6LHA4UGoyG2agOeV6Uu03Thn8RVcsTu1Q.mp4)
D/DownloadWorker(25574): Setting an intent to open the file /storage/emulated/0/Download/gbUG2Ag6LHA4UGoyG2agOeV6Uu03Thn8RVcsTu1Q.mp4

Can you please tell me why it’s downloading the video in the Download folder only? Why it’s not taking the path I have given?

About this issue

  • Original URL
  • State: open
  • Created 3 years ago
  • Reactions: 13
  • Comments: 19 (1 by maintainers)

Most upvoted comments

For any one who wants to the downloaded files to private or local storage

1.go to the android implementation and look for DownloadWorkder.java file

2.look for this function addFileToDownloadsApi21 and replace its content with this File newFile = new File(getApplicationContext().getFilesDir(), filename); return newFile;

  1. also comment this // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // uriApi29 = addFileToDownloadsApi29(filename); // if (isResume) { // outputStream = context.getContentResolver().openOutputStream(uriApi29, “wa”); // } else { // outputStream = context.getContentResolver().openOutputStream(uriApi29, “w”); // } // } else { // fileApi21 = addFileToDownloadsApi21(filename); // outputStream = new FileOutputStream(fileApi21, isResume); // }

and add this to bottom

fileApi21 = addFileToDownloadsApi21(filename); outputStream = new FileOutputStream(fileApi21, isResume);

Also comment out a big chunk of code in => if (status == DownloadStatus.COMPLETE) {}. condition

seems reckless but its a fix, you can file your files in the local storage

i am also facing the same issue, i wanted to download a file to private storage by path provided by getApplicationSupportDirectory but the package keeps downloading to downloads folder in the external storage

I know this issue, it comes from updates in Android implementation due to support Scoped Storage model in Android 11. In Android 11, app can no longer create dedicated and app-specific directories with external storage. It causes savedDir broken and confused. I am in process to re-design this plugin with new strategy to manage file download location. It is still in triage and discussion so it’s very appreciated to have contribution and feedback from developers for this PR

P/S: for temporary solution, I publish v1.7.1 to fix the issue in case of internal storage. Use-case of external storage in Android 11, savedDir will be ignored and downloaded files are always saved to Downloads folder (config by setting saveToPublicStorage to true)

Same issue here

Same issue here, can someone do a fork with the fix ? ^^’

https://github.com/abeyshiferaw0/flutter_downloader.git

this is the fork that i used, but it is only for downloading to internal storage only

just pass your desired location starting from getApplicationSupportDirectory() and it will work on both android and ios

e.g ` /// to get downloaded file save path Future<String> getSaveDir() async { Directory directory = await getApplicationSupportDirectory(); Directory saveDir = Directory(“${directory.absolute.path}${Platform.pathSeparator}SUB_FOLDER”); bool exists = await saveDir.exists(); if (!exists) { await saveDir.create(recursive: true); } return saveDir.path; }

/// start download with path from getSaveDir() FlutterDownloader.enqueue( url: URL, savedDir: getSaveDir(), fileName: FILE_NAME, showNotification: true, openFileFromNotification: false, );

`

@hnvn you can ask for this permission to create the folder await requestPermission(Permission.manageExternalStorage);

This is an epic fail. I have code in the field that is now downloading to the wrong directory. What in the world would make you change this behavior!!!???

Thank you @abeyshiferaw0 , works perfectly. Though I was wondering when this can be fixed in the master repo