Expo ImageManipulator返回文件大小与FileSystem获取结果不一致
问题
使用Expo ImagePicker选择或拍摄照片后,调用ImageManipulator.manipulateAsync将图片调整为宽度2000的JPEG格式。操作后返回的对象显示文件大小为153297,但通过FileSystem.getInfoAsync获取同一URI的文件信息时,大小却为1154493,上传该文件时也使用原文件大小。URI完全一致,请问是否存在缓存问题或其他遗漏点?
代码示例
import * as ImageManipulator from "expo-image-manipulator"; import * as FileSystem from 'expo-file-system' const image = await ImageManipulator.manipulateAsync(selected[i].uri, [ { resize: { width: 2000 } } ], { format: ImageManipulator.SaveFormat.JPEG });
ImageManipulator操作输出
{ "assetId": "...", "base64": null, "duration": null, "exif": null, "fileName": "IMG_1446.jpg", "fileSize": 153297, "height": 2208, "mimeType": "image/jpeg", "type": "image", "uri": "file:///var/mobile/Containers/Data/Application/.../Library/Caches/ExponentExperienceData/.../ImageManipulator/95AB6100-2577-4BC4-B4DA-47D47BCC2BE1.jpg", "width": 1242 }
FileSystem获取的文件信息
let info = await FileSystem.getInfoAsync(updated[i].uri);
{ "exists": true, "isDirectory": false, "md5": "...", "modificationTime": 1707940541.238159, "size": 1154493, "uri": "file:///var/mobile/Containers/Data/Application/.../Library/Caches/ExponentExperienceData/.../ImageManipulator/95AB6100-2577-4BC4-B4DA-47D47BCC2BE1.jpg" }
解决分析
- ImageManipulator的fileSize计算偏差:Expo返回的
fileSize可能是内存中处理后数据的预估大小,并非实际写入磁盘的最终文件大小。磁盘文件可能因为额外写入EXIF信息、格式补全等操作,导致实际体积和预估数值不符。 - iOS文件缓存干扰:iOS的文件系统缓存可能让
FileSystem.getInfoAsync读取到旧的文件数据。可以在manipulateAsync执行后短暂延迟再获取文件信息,或者上传时直接使用ImageManipulator返回的对象,而非通过URI重新读取。 - 压缩参数未明确设置:你只指定了JPEG格式,但没设置
quality压缩参数。默认情况下ImageManipulator可能使用较高质量压缩,导致实际文件体积远超预估。可以补全参数,比如{ format: ImageManipulator.SaveFormat.JPEG, quality: 0.7 },明确压缩等级后再对比大小。 - 变量引用错误:确认
updated[i].uri和ImageManipulator返回的image.uri是否完全一致——虽然显示的省略路径相同,但完整路径可能存在差异,比如缓存目录的细微区别。直接打印完整路径对比即可验证。 - 上传逻辑未正确指向处理后文件:如果上传时读取的是原始图片的URI而非处理后的,就会出现使用原文件大小的情况。上传时直接调用
image.uri,避免依赖其他变量存储的路径。
内容的提问来源于stack exchange,提问作者Stephen Clark
相关产品推荐
相关产品推荐

