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
相关产品推荐
相关产品推荐

