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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:18:03