You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:17:49