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

15

我正在制作一款 Android 应用程序,并在使用图像选择插件时;

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

File image = File(pickedFile.path);

“'image'是应用程序缓存中原始图像的副本,但我希望直接使用原始图像的路径将其保存在我的应用程序中,因为我不想增加应用程序缓存的大小。我看到弃用的方法“pickImage”可以实现此目的(不复制到缓存),但新的“getImage”似乎会自动复制,并且'image'的路径是缓存图像的路径。”
“如何获取所选图像的原始路径而不将其缓存?(我假设使用原始文件路径仍然适用于使用FileImage(File(originalPath))在应用程序中显示它的情况,这是正确的假设吗?)”

你好,我看到你六个月前发布了这篇文章。我现在也遇到了同样的问题,而且卡得很厉害。请问你是否有任何解决方法? - Waqas Younis
你找到解决方案了吗? - Roger Gusmao
你解决了吗? - fractal
我也在寻找解决方案!有人可以帮忙吗? - Ayrix
2个回答

1
在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设备上的文件成为可能。

0

我有一个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);
    }
  }

1
我刚试了file_picker,但它也自动缓存了图像,并且“filePath”包含了缓存图像的路径,所以这并没有解决我的问题。 - Milky
2
我遇到了同样的问题。有人知道如何获取原始路径或特定的原始文件扩展名吗? - fractal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接