Flutter:flutter_image_compress处理iOS端DeepAR图片时触发断言错误
Flutter iOS端flutter_image_compress压缩DeepAR图片的断言错误修复
问题现象
Android端压缩流程正常,iOS端触发断言错误:
'package:flutter_image_compress_platform_interface/src/validator.dart': Failed assertion: line 23 pos 9: '(name.endsWith('.jpg') || name.endsWith('.jpeg'))': The jpeg format name must end with jpg or jpeg.
根因
iOS端DeepAR捕获的图片默认保存为.png格式,而flutter_image_compress在未明确指定输出格式时,会根据目标文件后缀推断格式。当尝试将PNG源文件压缩为JPEG(通过quality参数默认触发),但目标文件后缀仍为.png时,会触发内部格式校验断言。
修复方案
核心是明确指定输出格式为JPEG,同时确保目标文件后缀符合要求,避免依赖自动推断。修改后的代码如下:
import 'package:path/path.dart' as path; Future<List<File>> getFilesFromFilePaths(List<String> filePaths) async { List<File> compressedFiles = []; final String tempDir = await DeviceUtils.getTempFolder(); await Future.forEach(filePaths, (String sourceFilePath) async { // 替换原文件后缀为.jpg,确保目标文件名符合JPEG格式要求 final String baseName = path.basenameWithoutExtension(sourceFilePath); final String filename = '_$baseName.jpg'; final String targetFilePath = '$tempDir/$filename'; XFile? compressedFile = await FlutterImageCompress.compressAndGetFile( sourceFilePath, targetFilePath, quality: 70, autoCorrectionAngle: true, format: CompressFormat.jpeg, // 强制指定输出为JPEG格式 ); if (compressedFile != null) { compressedFiles.add(File(compressedFile.path)); } }); return compressedFiles; }
关键修复点
- 强制指定输出格式:添加
format: CompressFormat.jpeg,彻底避免库根据源/目标文件后缀自动推断格式的冲突 - 规范目标文件名:使用
basenameWithoutExtension提取原文件名(不含后缀),统一追加.jpg后缀,确保符合库的格式校验规则 - 兼容多后缀文件名:避免直接替换最后一个点的字符,处理类似
image.v1.png这类含多个点的文件名
内容的提问来源于stack exchange,提问作者majid
相关产品推荐
相关产品推荐

