Flutter如何获取文件Magic Number以识别无后缀的文件类型
解决方案
你需要先读取选中文件的头部字节(即Magic Number),再传入lookupMimeType的headerBytes参数即可完成识别,不需要依赖文件后缀。以下是Flutter场景下的完整实现步骤:
实现步骤
- 第一步:获取file_picker选中文件的File对象
import 'dart:io'; import 'dart:math'; import 'package:file_picker/file_picker.dart'; import 'package:mime/mime.dart'; FilePickerResult? pickResult = await FilePicker.platform.pickFiles(); if (pickResult == null) return; // 用户取消选择的情况 File targetFile = File(pickResult.files.single.path!); - 第二步:读取文件前16个字节(覆盖绝大多数文件的Magic Number长度,无需读取全文件)
RandomAccessFile raf = await targetFile.open(mode: FileMode.read); int readLength = min(16, await raf.length()); List<int> headerBytes = readLength > 0 ? await raf.read(readLength) : []; await raf.close(); - 第三步:识别MIME类型并转换为文件后缀
// 第一个参数传空值即可,headerBytes优先级高于文件名后缀判断 String? mimeType = lookupMimeType('', headerBytes: headerBytes); // MIME转对应后缀,识别失败默认返回二进制流类型 String? fileSuffix = extensionFromMime(mimeType ?? 'application/octet-stream');
注意事项
- 纯文本类文件(txt、json、csv等)无固定Magic Number,识别会返回通用的
text/plain类型,可根据业务需求做额外适配 - 若业务有指定允许上传的文件类型,可提前做白名单校验,不符合要求直接拦截
内容的提问来源于stack exchange,提问作者Zhu
相关产品推荐
相关产品推荐

