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

Flutter Web中Base64转图片打包Zip报错:Uint8List转InputStreamBase失败

解决Flutter Web中Base64转图片打包Zip的类型错误问题

问题原因

你遇到的Expected a value of type 'InputStreamBase', but got one of type 'NativeUint8List'错误,是因为直接将Uint8List强制转换为InputStreamBase类型导致的——两者属于不同的类型体系,无法直接强转。需要用archive包提供的流类来包装Uint8List,才能符合ArchiveFile.stream的参数要求。

修正后的代码

import 'dart:convert';
import 'dart:typed_data';
import 'dart:html' as html;
import 'package:archive/archive.dart';

void zipBase64Images(List<String> listOfB64) {
  final encoder = ZipEncoder();
  final archive = Archive();

  for (int index = 0; index < listOfB64.length; index++) {
    // 解码Base64为Uint8List
    final Uint8List imageBytes = base64.decode(listOfB64[index]);
    // 用InputStream.fromUint8List将Uint8List包装成InputStreamBase实例
    final inputStream = InputStream.fromUint8List(imageBytes);
    // 创建ArchiveFile,文件名添加索引避免重复覆盖
    final archiveFile = ArchiveFile.stream(
      "image_$index.png",
      imageBytes.lengthInBytes,
      inputStream,
    );
    archive.addFile(archiveFile);
  }

  // 压缩生成Zip文件的Uint8List
  final zipBytes = encoder.encode(archive, level: Deflate.BEST_COMPRESSION);
  if (zipBytes != null) {
    downloadZip("test.zip", zipBytes);
  }
}

void downloadZip(String filename, Uint8List bytes) {
  // Flutter Web中实现文件下载的标准方式
  final blob = html.Blob([bytes]);
  final url = html.Url.createObjectUrlFromBlob(blob);
  final anchor = html.AnchorElement(href: url)
    ..setAttribute("download", filename)
    ..click();
  html.Url.revokeObjectUrl(url);
}

关键改动说明

  • 类型转换修正:用InputStream.fromUint8List(imageBytes)替代强制类型转换,将Uint8List包装成archive包要求的InputStreamBase子类实例。
  • 文件名优化:循环中添加索引后缀,避免多个文件使用相同文件名导致Zip内文件被覆盖。
  • 下载逻辑完善:补充了Flutter Web环境下的标准下载实现,确保生成的Zip能正确触发浏览器下载。

内容的提问来源于stack exchange,提问作者Gafts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:37:11