使用video_thumbnail生成的缩略图上传时报FileSystemException无法获取文件长度
错误原因
- 核心问题是错误使用了
File.fromRawPath()方法:该方法的入参要求是操作系统文件路径的原始字节编码,而非图片的二进制内容。你传入缩略图的UInt8List后生成的是一个指向无效路径的空File对象,不存在对应的实际磁盘文件,因此读取文件路径、获取文件长度时都会抛出异常。 - 普通图片上传正常是因为传入的是已经存储在磁盘上的真实File对象,路径和文件内容均有效。
解决方法
有两种可选方案,按需选择:
方案1:将缩略图二进制数据写入本地临时文件后再上传
先把拿到的uint8list写入临时目录生成真实File,再调用原上传方法即可,不需要修改原有上传逻辑,适配成本最低。修改缩略图生成部分的代码:
import 'dart:io'; import 'package:path_provider/path_provider.dart'; // ... 原有代码 final uint8list = await VideoThumbnail.thumbnailData( video: _videoFile!.path, imageFormat: ImageFormat.JPEG, ); // 新增:写入临时文件 final tempDir = await getTemporaryDirectory(); final posterFile = await File('${tempDir.path}/${DateTime.now().microsecondsSinceEpoch}.jpg').writeAsBytes(uint8list!); _videos.add( VideosModel( id: await FileUploader.uploadFile(_videoFile, "POST_VIDEO"), posterId: await FileUploader.uploadFile(posterFile, "POST_IMG"), ), );
方案2:扩展上传方法,支持直接传二进制数据
修改上传工具类,新增支持传入UInt8List的重载方法,不需要额外写磁盘,性能更好。
首先新增上传方法:
// 原有File上传方法保留,新增二进制上传方法 static Future<String> uploadFileFromBytes(Uint8List bytes, String ref, {String fileName = "upload.jpg"}) async { FormData formData = FormData.fromMap({ "file": MultipartFile.fromBytes(bytes, filename: fileName), }); Response response = await UATHTTPClient().dio.post("v1/aws/upload", data: formData, queryParameters: { "ref": ref, }); return response.data['id']; }
调用时直接传缩略图的uint8list即可:
_videos.add( VideosModel( id: await FileUploader.uploadFile(_videoFile, "POST_VIDEO"), posterId: await FileUploader.uploadFileFromBytes(uint8list!, "POST_IMG"), ), );
内容的提问来源于stack exchange,提问作者Lalit Rawat
相关产品推荐
相关产品推荐

