文件修改数据始终为当前时间

问题描述 投票:0回答:5

我正在使用以下代码片段来尝试检索文件的修改时间:

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()}");

每当我运行上面的代码片段时,无论文件是什么,它都会打印当前的日期时间,而不是文件的修改后的数据时间

flutter dart
5个回答
2
投票

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)

参考文献


0
投票

不幸的是,我不相信此信息可用(至少在 Android 上,不确定 iOS)


0
投票

使用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();

0
投票

您可以使用

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;

0
投票

正如 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();
© www.soinside.com 2019 - 2024. All rights reserved.