Flutter中如何将Image实例转换为File实例实现图片上传?
问题背景
开发中使用VideoThumbnail类获取视频缩略图时,先拿到了Uint8List格式的图片字节,将其转为Image实例用于UI展示后,需要进一步得到File类实例适配现有上传逻辑。
相关现有代码如下:
- 获取缩略图字节:
final uint8List = await VideoThumbnail.thumbnailData(video: videoFile.path,);
- 转UI用Image实例:
Image image = Image.memory(uint8List);
- 已有的文件上传方法(接收File类型参数):
void asyncFileUpload(File file) async { //create multipart request for POST or PATCH method var request = http.MultipartRequest("POST", Uri.parse("127.0.0.1/upload")); //create multipart using filepath, string or bytes var pic = await http.MultipartFile.fromPath("image", file.path); //add multipart to request request.files.add(pic); var response = await request.send(); //Get the response from the server var responseData = await response.stream.toBytes(); var responseString = String.fromCharCodes(responseData); print(responseString); }
实现方案
不需要从ImageUI组件反向解析数据生成File:Image.memory是用于界面渲染的组件,反向提取字节的流程冗余,还容易出现图片编码、内存泄漏相关问题。你最初拿到的uint8List就是缩略图的原始字节数据,直接将其写入磁盘临时文件,就能得到符合上传要求的File实例,是最简单高效的方案。
- 先引入所需依赖:
import 'dart:io'; import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart';
- 编写字节转File的工具方法:
Future<File> convertThumbBytesToFile(Uint8List thumbBytes) async { // 获取应用可用的临时存储目录 final tempDir = await getTemporaryDirectory(); // 生成带时间戳的唯一文件路径,避免重名覆盖旧文件 final targetPath = p.join(tempDir.path, 'video_thumbnail_${DateTime.now().millisecondsSinceEpoch}.jpg'); // 将字节写入对应路径,得到可直接使用的File实例 final File thumbFile = File(targetPath); await thumbFile.writeAsBytes(thumbBytes); return thumbFile; }
- 调用方法拿到File后,直接传入现有上传逻辑即可:
// 直接传入最开始从VideoThumbnail拿到的uint8List即可,不需要提前转Image组件 final thumbFile = await convertThumbBytesToFile(uint8List); asyncFileUpload(thumbFile);
额外注意点
如果在安卓模拟器上调试本地服务,127.0.0.1指向的是模拟器自身,需要替换为10.0.2.2才能访问电脑本地启动的服务;iOS模拟器可直接使用127.0.0.1。
内容的提问来源于stack exchange,提问作者Abdul Ahad Akram
相关产品推荐
相关产品推荐

