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

Flutter中不导入dart:html如何将文件转换为Blob,dart:html无法在Android运行

Flutter端无dart:html依赖实现文件转Blob方案

核心思路:dart:html提供的Blob仅适配Web平台,全端兼容的实现完全不需要引入该包,通过Dart原生字节处理+条件导入适配即可解决编译报错问题。


1. 纯Dart通用转换方案(全端适用,90%以上场景可直接用)

如果转换后的Blob仅用于网络上传、本地二进制存储等场景,不需要Web端原生DOM级Blob对象的话,直接读取文件为Uint8List即可作为Blob等价数据使用,Flutter生态内的绝大多数网络库(比如dio)、文件操作库都直接支持Uint8List类型的二进制数据传参。
示例代码:

import 'dart:io';
import 'dart:typed_data';

// 传入本地文件路径,直接返回等价Blob的Uint8List数据
Future<Uint8List> fileToBlob(String filePath) async {
  final localFile = File(filePath);
  return await localFile.readAsBytes();
}

上传时指定MIME类型的示例(以dio为例):

final fileBytes = await fileToBlob("/storage/emulated/0/test.jpg");
final formData = FormData.fromMap({
  "upload_file": MultipartFile.fromBytes(
    fileBytes,
    filename: "test.jpg",
    contentType: MediaType("image", "jpeg"), // 按需指定对应MIME类型即可
  )
});

2. 多端兼容方案(同时支持Web端原生Blob对象)

如果项目需要同时兼容Web端,必须用到Web原生Blob对象,又要避免移动端编译时报Error: Not found: 'dart:html'错误,用Dart条件导入做平台分层实现即可,dart:html仅会在Web端编译时被引入,不会触发移动端编译报错。

步骤1:定义通用抽象接口

新建blob_utils.dart:

import 'dart:typed_data';

export 'blob_utils_stub.dart' 
  if (dart.library.html) 'blob_utils_web.dart' 
  if (dart.library.io) 'blob_utils_native.dart';

abstract class BlobUtils {
  dynamic convertFileToBlob(Uint8List bytes, String contentType);
  static late BlobUtils instance;
}

步骤2:实现原生端(安卓/iOS/桌面)逻辑

新建blob_utils_native.dart:

import 'dart:typed_data';
import 'blob_utils.dart';

class BlobUtilsNative extends BlobUtils {
  @override
  dynamic convertFileToBlob(Uint8List bytes, String contentType) {
    // 原生端直接返回Uint8List即可正常使用
    return bytes;
  }
}

void initBlobUtils() {
  BlobUtils.instance = BlobUtilsNative();
}

步骤3:实现Web端逻辑

新建blob_utils_web.dart:

import 'dart:html' as html;
import 'dart:typed_data';
import 'blob_utils.dart';

class BlobUtilsWeb extends BlobUtils {
  @override
  dynamic convertFileToBlob(Uint8List bytes, String contentType) {
    // Web端返回原生Blob对象
    return html.Blob([bytes], contentType);
  }
}

void initBlobUtils() {
  BlobUtils.instance = BlobUtilsWeb();
}

步骤4:全局初始化后调用

在项目main函数初始化时调用一次initBlobUtils(),之后全端通用调用方式:

final fileBytes = await File("本地文件路径").readAsBytes();
final blobData = BlobUtils.instance.convertFileToBlob(fileBytes, "image/png");

该方案下移动端编译时完全不会引入dart:html相关代码,不会触发找不到依赖的报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:36:04