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)
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;
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
savedDirbroken 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 PRP/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,
savedDirwill be ignored and downloaded files are always saved to Downloads folder (config by settingsaveToPublicStoragetotrue)Same issue here
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