如何获取在 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 插件为每个选择的文件分配自己的名称