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

Flutter Web中如何从file_picker获取文件流?

解决方案

从相册选择图片获取文件流

你已经开启了withReadStream: true参数,但当前代码误用了bytes字段,直接读取readStream就能拿到文件流,无需转base64。修改后的代码如下:

void chooseImage() async {
  pickedFile = await FilePicker.platform.pickFiles(
    type: FileType.custom,
    withReadStream: true, // 该参数已开启,确保能获取文件流
    allowedExtensions: ['jpg', 'jpeg', 'png']
  );

  if (pickedFile != null) {
    try {
      // 获取文件读取流
      final Stream<List<int>>? fileStream = pickedFile!.files.first.readStream;
      if (fileStream != null) {
        String? mime = pickedFile!.files.first.extension;
        // 直接将流传入上传方法,和拖拽场景的getFileStream(event)用法统一
        getS3url("image/$mime", fileStream, from: "cameraIcon");
      }
    } catch (err) {
      print(err);
    }
  }
}

适配上传方法getS3url

需要调整getS3url的参数类型,使其支持接收Stream<List<int>>类型的文件数据,这样相册选择和拖拽的流就能复用同一套上传逻辑:

// 示例调整后的getS3url方法签名
Future<void> getS3url(String path, Stream<List<int>> fileStream, {required String from}) async {
  // 这里用fileStream执行上传逻辑,和拖拽时处理getFileStream(event)的逻辑一致
  // 比如通过http包发送流:
  // final request = http.MultipartRequest('POST', Uri.parse('你的上传接口地址'));
  // request.files.add(http.MultipartFile(
  //   'file', 
  //   fileStream, 
  //   pickedFile!.files.first.size, 
  //   filename: pickedFile!.files.first.name
  // ));
  // final response = await request.send();
}

关键说明

  • 开启withReadStream: true后,pickedFile!.files.first.readStream返回的Stream<List<int>>,和flutter_dropzone的getFileStream(event)返回的流类型完全一致,可直接复用上传逻辑。
  • 无需将文件转成base64,直接用流上传更高效,尤其适合大文件场景。

内容的提问来源于stack exchange,提问作者Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:16:39