我的主要目标是从链接下载文件,然后将其保存到手机的内部存储中,以便可以通过手机的文件管理器对其进行访问。我目前正在通过运行软件包回购中提供的示例Dio来试用code软件包。在运行程序时,我遇到了路径问题。当我使用./example/flutter.png
作为下载路径时,将显示I/flutter (10109): FileSystemException: Cannot open file, path = './example/flutter.png' (OS Error: No such file or directory, errno = 2)
。当我使用(await getApplicationDocumentsDirectory()).path
生成一个String
值的/data/user/0/com.example.downloadexample/app_flutter
作为路径时,没有出现错误,但文件不存在。我尝试了后一种方法的其他变体,但没有成功。有人可以帮我解决这个问题吗?
非常感谢。
答案 0 :(得分:0)
我使用http包,而不是Dio,代码:
Future<String> fetchNetFileToDoc(String url, String filename) async {
final path = await getApplicationDocumentsDirectory();
File docFile = File('$path/$filename');
if(await docFile.exists()){
print( '${docFile.path} exits');
return docFile.path;
}
http.Response response = await http.get(url);
// todo - check status
await docFile.writeAsBytes(response.bodyBytes, flush: true);
return docFile.path;
}
如果我调用此方法,例如:fetchNetFileToDoc('http://a.com/a.mp3', 'a.mp3')
它显示了相同的错误:
FileSystemException: Cannot open file, path= 'Direcotry: '/data/user/0/com.example.master_lu/app_flutter'/a.mp3' (OS Error: No such file or directory, errno = 2)
但是,如果我使用getTemporaryDirectory(),请将代码更改为此:
Future<String> fetchNetFileToTemp(String url, String filename) async {
Directory tempDir = await getTemporaryDirectory();
String tempPath = tempDir.path;
File tempFile = File('$tempPath/$filename');
if(await tempFile.exists()){
print( '${tempFile.path} exits');
return tempFile.path;
}
http.Response response = await http.get(url);
// todo - check status
await tempFile.writeAsBytes(response.bodyBytes, flush: true);
return tempFile.path;
}
没关系,它可以与内部存储一起使用。将文件保存到data/user/0/com.example.master_lu/cache/a.mp3
master_lu是我的项目的名称。
最新信息=>我解决了问题,await getApplicationDocumentsDirectory
返回Future<Directory>
所以,这里是正确的代码:
Future<String> fetchNetFileToDoc(String url, String filename) async {
final docDir = await getApplicationDocumentsDirectory();
String docPath = docDir.path;
File docFile = File('$docPath/$filename');
if(await docFile.exists()){
print( '${docFile.path} exits');
return docFile.path;
}
http.Response response = await http.get(url);
// todo - check status
await docFile.writeAsBytes(response.bodyBytes, flush: true);
return docFile.path;
}