Flutter DIO:使用 Dio 包的二进制主体上传图像

Jae*_*ger 10 api post dart flutter dio

使用 http 包,我可以通过将二进制数据放入 post 调用的正文中来将图像发送到服务器,如以下代码片段所示:

var response = await http.post('My_url', body: File(path).readAsBytesSync(),  headers: {
                    'apikey': 'myAPIKEY',
                    'Content-Type': 'image/*', // set content-length
                  });
Run Code Online (Sandbox Code Playgroud)

我不能使用 Dio 做同样的事情,我不知道如何直接将二进制数据放入正文中(就像我可以用邮递员做的那样)

邮差

Ani*_*Das 14

我也遇到和你一样的情况。在 DIO 中,您必须通过流发送二进制数据。这是我如何实现它的示例,

Uint8List image = File(path).readAsBytesSync();

Options options = Options(
  contentType: lookupMimeType(path),
  headers: {
    'Accept': "*/*",
    'Content-Length': image.length,
    'Connection': 'keep-alive',
    'User-Agent': 'ClinicPlush'
  }
);

Response response = await dio.put(
  url,
  data: Stream.fromIterable(image.map((e) => [e])),
  options: options
);
Run Code Online (Sandbox Code Playgroud)


sul*_*rza 5

Anirban Das解决方案正在运行,但是当我尝试上传 24MB 照片文件时,它崩溃了,可能是由于

Stream.fromIterable(image.map((e) => [e]))

因此,我尝试直接将文件读取为流 file.OpenRead()=>,它返回Strea<List<in>>>

不管是否是重音,但上传速度也增加了(也许当你映射 e => [e] 时它会减慢发送数据的速度)但谁知道也许我错了

所以我的最终代码是

Uint8List image = File(path).readAsBytesSync();

Options options = Options(
  contentType: lookupMimeType(path),
  headers: {
    'Accept': "*/*",
    'Content-Length': image.length,
    'Connection': 'keep-alive',
    'User-Agent': 'ClinicPlush'
  }
);

Response response = await dio.put(
  url,
  data: file.openRead(), <--- change here
  options: options
);
Run Code Online (Sandbox Code Playgroud)


小智 3

我已经声明了一个名为“data”的 FormData 对象,并且有一个图像映射,其中键作为文件名,值作为文件路径。'image' 是在服务器端定义的键。

 data.files.add(MapEntry(
    'image',
      await MultipartFile.fromFile(image.values.first, filename: "${image.values.first.split("/").last}")
                                ));
Run Code Online (Sandbox Code Playgroud)