Flutter Dio软件包下载路径

时间:2018-07-05 16:49:13

标签: dart flutter

我的主要目标是从链接下载文件,然后将其保存到手机的内部存储中,以便可以通过手机的文件管理器对其进行访问。我目前正在通过运行软件包回购中提供的示例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作为路径时,没有出现错误,但文件不存在。我尝试了后一种方法的其他变体,但没有成功。有人可以帮我解决这个问题吗?

非常感谢。

1 个答案:

答案 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;
}