5

使用 http 包,我可以通过将二进制数据放在 post 调用的主体中,就像在这段代码的片段中一样,将图像发送到服务器:

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

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

邮差

4

5 回答 5

8

我也遇到了和你一样的情况。在 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
);
于 2021-01-28T09:34:04.897 回答
4

如果有人偶然发现同样的问题,只需提出我的解决方案。

我必须在签名的谷歌存储 URL 上上传文件。在 PUT 请求正文中插入文件二进制数据所需的 API。无法使用 DIO 插件实现,我使用 DART HTTP 包解决了这个问题,下面是示例代码。

import 'package:http/http.dart' as http;

await http.put(
  Uri.parse(uploadURL),
  headers: {
    'Content-Type': mimeType,
    'Accept': "*/*",
    'Content-Length': File(filePath).lengthSync().toString(),
    'Connection': 'keep-alive',
  },
  body: File(filePath).readAsBytesSync(),
);
于 2020-10-30T07:26:04.687 回答
2

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

 data.files.add(MapEntry(
    'image',
      await MultipartFile.fromFile(image.values.first, filename: "${image.values.first.split("/").last}")
                                ));
于 2020-06-30T05:28:41.710 回答
1

使用 dio 包将二进制数据上传到谷歌存储 api 时,我不断收到 http 403。我能够使用以下方法解决此问题:

      Response responseGoogleStorage = await dio.put(
      googleStorage.url,
      data: File(_imageFile.path).readAsBytesSync(),
      options: Options(
        headers: {
          'Content-Type': contentType,
          'Accept': "*/*",
          'Content-Length': File(_imageFile.path).lengthSync().toString(),
          'Connection': 'keep-alive',
        },
      ),
    );
于 2021-01-12T13:27:15.173 回答
0

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
);
于 2021-11-17T08:40:59.437 回答