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
相关产品推荐
相关产品推荐

