如何在Flutter中使用Image.network获取图片EXIF元数据与创建修改时间
Flutter 网络图片获取生成时长的实现方案
方案一:读取图片EXIF信息获取时间
该方案可以直接从图片文件中提取拍摄/创建时间,适合需要精确图片生成时间的场景:
- 第一步:在
pubspec.yaml中添加EXIF解析依赖dependencies: exif: 3.2.1 http: ^1.1.0 - 第二步:编写时间提取逻辑,先下载图片字节再解析EXIF字段
import 'package:http/http.dart' as http; import 'package:exif/exif.dart'; import 'package:intl/intl.dart'; Future<Duration?> getImageExistDuration(String imageUrl) async { try { final response = await http.get(Uri.parse(imageUrl)); if (response.statusCode != 200) return null; final exifData = await readExifFromBytes(response.bodyBytes); DateTime? createTime; // 优先读取原始拍摄时间,无数据则回退读取EXIF存储时间 if (exifData.containsKey('EXIF DateTimeOriginal')) { final timeStr = exifData['EXIF DateTimeOriginal']!.printable; createTime = DateFormat("yyyy:MM:dd HH:mm:ss").parse(timeStr); } else if (exifData.containsKey('EXIF DateTime')) { final timeStr = exifData['EXIF DateTime']!.printable; createTime = DateFormat("yyyy:MM:dd HH:mm:ss").parse(timeStr); } if (createTime == null) return null; // 计算当前时间和图片生成时间的差值,就是生成时长 return DateTime.now().difference(createTime); } catch (e) { return null; } } - 注意:部分图片源会主动抹除EXIF信息,部分图片格式本身不支持EXIF存储,该场景下此方案会失效。
方案二:服务端接口同步返回时间(稳定性最高)
该方案不受EXIF限制,性能开销最低,是生产环境优先选择的方案:
- 服务端在返回图片链接的业务接口中,同步返回图片的生成/上传时间戳
- 前端直接用返回的时间戳和当前时间计算差值即可,不需要额外发起图片相关请求
- 要避免客户端本地时间不准的问题,可以让接口同步返回服务端当前时间作为计算基准。
方案三:读取HTTP响应头的Last-Modified字段
该方案不需要额外解析EXIF,请求开销极小,适合不需要精确拍摄时间的场景:
import 'package:http/http.dart' as http; Future<Duration?> getImageDurationFromHeader(String imageUrl) async { try { // 用HEAD请求只拉取响应头,不需要下载完整图片 final response = await http.head(Uri.parse(imageUrl)); if (response.statusCode != 200 || !response.headers.containsKey('last-modified')) { return null; } final modifyTime = HttpDate.parse(response.headers['last-modified']!); return DateTime.now().difference(modifyTime); } catch (e) { return null; } }
- 注意:该时间是图片资源在服务器上的最后修改时间,并非图片实际拍摄生成时间。
内容的提问来源于stack exchange,提问作者Rodrigo Gusso
相关产品推荐
相关产品推荐

