我正在使用以下代码片段来尝试检索文件的修改时间:
import 'dart:io';
import 'package:image_picker/image_picker.dart';
final picker = ImagePicker();
final pickedFile = await picker.getVideo(source: ImageSource.gallery);
final file = File(pickedFile.path);
print("file modified time: ${file.lastModifiedSync().toIso8601String()}");
每当我运行上面的代码片段时,无论文件是什么,它都会打印当前的日期时间,而不是文件的修改后的数据时间
image_picker
的工作方式是创建您要在应用程序中上传的文件的临时副本。通过此实现,您提到的“当前日期”在逻辑上是文件的“上次修改日期”(或创建日期)。因此,目前您可能无法使用此插件检索它。
但是,使用 Flutter 的 Platform Channels,您应该能够检索文件的属性,例如。对于 Android,在本机代码中使用
BasicFileAttributes
。
以 Android 为例:
File file = ...;
BasicFileAttributes attr = Files.readAttributes(file.toPath(), BasicFileAttributes.class);
long lastModifiedAt = attr.lastModifiedTime();
然后使用平台通道,您可以将这样的数据传递给Flutter:
result.success(lastModifiedAt)
参考文献
不幸的是,我不相信此信息可用(至少在 Android 上,不确定 iOS)
使用file_picker包进行测试,希望对image_picker有所帮助。
您可以使用 cross_file 包。
FilePickerResult? result = await FilePicker.platform.pickFiles();
final resultFile = result.files.first;
final resultFilePath = resultFile.path;
if (resultFilePath == null) {
throw EntityPathException();
}
/// Class from cross_file package
final xfile = XFile(resultFilePath);
final lastModified = await xfile.lastModified();
您可以使用
multi_image_picker
包代替。所选图像的创建时间可以通过 MetaData 类访问,如下所示:
List<Asset> images = await MultiImagePicker.pickImages(maxImages: 10, enableCamera: true);
Metadata metadata = await images[0].metadata;
DateTime takenOn = metadata.exif.dateTimeOriginal;
正如 Joshua 提到的,
image_picker
始终创建文件的临时副本,因此它将始终返回最后修改日期。但是,如果您将 requestFullMetadata 设置为 true,则同一插件会保留 EXIF 数据。 requestFullMetadata的默认值为true,因此只要原始文件有EXIF数据,就可以获取原始日期。 EXIF 适用于 JPEG 文件,存在一个已知的问题,即从 Google 相册导入的图像缺少 EXIF 数据。不过,你可以尝试这个方法。就我而言,我只需要获取屏幕截图文件,该文件以 JPEG 格式存储并具有 EXIF 数据。我能够使用 native_exif
获取原始日期和时间。
final picked = await ImagePicker().pickImage(source: ImageSource.gallery);
if (picked == null) {
return null;
}
final exif = await Exif.fromPath(picked.path);
final date = await exif.getOriginalDate();