如何获取在 Flutter 中使用图像选择器插件选择的图像的原始路径,而不是复制到缓存?

Posted

技术标签:

【中文标题】如何获取在 Flutter 中使用图像选择器插件选择的图像的原始路径,而不是复制到缓存?【英文标题】:How to get the original path of an image chosen with image picker plugin in Flutter instead of copying to cache? 【发布时间】:2020-11-28 06:01:57 【问题描述】:

我正在制作一个 android 应用,并且在使用图像选择器插件时;

final pickedFile = await ImagePicker().getImage(source: ImageSource.gallery);
File image = File(pickedFile.path);

“图像”是应用程序缓存中原始图像的副本,但是,我想直接使用原始图像的路径将其保存在我的应用程序中,因为我不希望应用程序缓存大小增加。我看到不推荐使用的方法“pickImage”完成了这一点(不复制到缓存),但新的“getImage”似乎会自动复制,'image's path is the path of the cached image.

如何在不缓存的情况下仅获取所选图像的原始路径? (我假设使用原始文件的路径仍然可以使用FileImage(File(originalPath)) 在应用程序中显示它,这是正确的假设吗?)

【问题讨论】:

嗨,我看到你在 6 个月前发布了它。我现在正面临这个问题,而且我陷入了困境。你能告诉我你是否有任何解决方法吗? 找到解决方案了吗? 你有解决方案吗? 我也在寻找解决方案!?谁能帮忙? 【参考方案1】:

我有一个file_picker 包的示例:

  var filePath = '';
  var fileExtension = '';
  var fileName = '';

  void buttonOnTap() async 
    try 
      filePath = await FilePicker.getFilePath(type: FileType.IMAGE);

      if (filePath != null) 
        fileName = filePath.split('/').last;
        fileExtension = fileName.split('.').last;
       else 
        filePath = '';
        fileName = '';
        fileExtension = '';
      
     catch (e) 

    if (filePath != '') 
      Image.file(File(filePath), fit: BoxFit.cover);
    
  

【讨论】:

我刚刚尝试了file_picker,但它也自动缓存了图像,并且“filePath”包含了缓存图像的路径,所以这并没有解决我的问题 我遇到了同样的问题。任何人都知道如何获取原始路径或特别是原始文件扩展名?【参考方案2】:

ios 上永远无法检索原始路径,而在 Android 上只能在 SDK 30 之前检索。

来自file_picker插件的FAQ,

在 Android 上的 file_picker 2.0.0 之前,原始路径是可能的,但是,在 iOS 中,它们根本不可能,因为 iOS 希望您制作一个缓存副本并对其进行处理。但是,2.0.0 引入了范围存储支持 (Android 10),并且根据 Android 文档建议,应通过两种方式访问​​文件:

通过文件 URI 选择用于 CRUD 操作(读取、删除、编辑)的文件并直接使用它——这是你真正想要的,但不幸的是 Flutter 不支持它,因为它需要一个绝对路径来打开文件描述符;
暂时缓存文件以进行上传或类似操作,或者只是复制到应用程序的持久存储中以便您以后可以访问它 - 这是当前正在执行的操作,即使您在第一次选择后可能需要移动/复制文件的额外步骤,让您可以更安全可靠地访问任何 Android 设备上的任何允许文件。

【讨论】:

以上是关于如何获取在 Flutter 中使用图像选择器插件选择的图像的原始路径,而不是复制到缓存?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter/Dart - 如何在其他屏幕上的图像选择器后更新图像

Flutter Image Picker 插件为每个选择的文件分配自己的名称

Flutter- 图像选择器包:通过删除操作一张一张地显示图像

如何在 Flutter 中添加文件选择器插件?

适用于 Web 和移动设备的 Flutter 图像选择器

在 Flutter 中使用 Multi Image Picker 选择图像后如何获取图像路径?