来自文件的Flutter PUT HTTP请求

时间:2019-10-23 19:21:27

标签: image http flutter mobile base64

需要一些帮助,使用PUT方法通过API将主体上的图像文件发送到NextCloud服务器,从而对Flutter中的HTTP请求进行故障排除。

和往常一样,我测试了通过POSTMAN发送请求以查看发生了什么。可以在“正文”选项卡中选择“二进制”,然后选择图像文件。

Sending on postman

文件按预期存在:

Nextcloud server

要在Flutter应用上实现此目标,我正在使用以下代码:

_imageFile =包含相机或图库中的图像。

RaisedButton(
  color: Colors.blueAccent,
  child: Text('enviar'),
  onPressed: () async {
    String base64Image = base64Encode(_imageFile.readAsBytesSync());
    print(base64Image);
    var client = http.Client();
    var request = http.Request(
        'PUT', Uri.parse('https://host123.com.br/remote.php/dav/files/82427565709/TOOP.jpeg'));
    request.headers.addAll(
        {HttpHeaders.authorizationHeader: 'Basic ODI0Mjc1NjU3MDk6Y2xlYW5uZXQ=', 'Content-Type': 'image/jpeg'});
    request.body = base64Image;
var streamedResponse = await client.send(request);
    client.close();
    print('ok!');
  },
),

终端上的结果

I/flutter ( 8349): /9j/4AAQSkZJRgABAQEASABIAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjY
I/flutter ( 8349): ok

Nextcloud服务器上通过APP发送的结果:

Nextcloud server 2

看起来像是编码或身体上发送的数据有问题。文件“损坏”

两个测试中的文件相同。

**更新**

按照建议将正文数据更改为仅字节之后,不进行base64encoding。 (下图)

Just bytes

也尝试使用.toString()方法进行转换,该文件转到了服务器,但与以前一样,看上去已损坏。

2 个答案:

答案 0 :(得分:1)

由于http包具有便捷的put方法,因此无需构造自己的请求。此方法(以及更常见的post一种)采用可选的body参数,即dynamic。如果传递字节,则逐字发送。如果传递字符串,则将其编码为字节并发送。您还可以将字符串映射传递到将进行形式编码的字符串。

您的代码可以简化为:

  var uri = Uri.parse(
      'https://host123.com.br/remote.php/dav/files/82427565709/Lowppp.jpeg');
  var response = await http.put(
    uri,
    headers: {
      HttpHeaders.authorizationHeader: 'Basic xxxxxxx', // insert correct credentials here
      'Content-Type': 'image/jpeg',
    },
    body: await _imageFile.readAsBytes(),
  );
  print(response.statusCode);

答案 1 :(得分:0)

@RichardHeap帮助找到了解决方案。 需要将正文作为字节发送,而无需转换为 bodyBytes request.bodyBytes = imageBytes;

并将其添加到请求中

完整代码正常工作

List<int> imageBytes = _imageFile.readAsBytesSync();
    var client = http.Client();
    var request = http.Request('PUT', Uri.parse('https://host123.com.br/remote.php/dav/files/82427565709/Lowppp.jpeg'));
    request.headers.addAll({HttpHeaders.authorizationHeader: 'Basic ODI0Mjc1NjU3MDk6Y2xlYW5uZXQ=', 'Content-Type': 'image/jpeg'});
    request.bodyBytes = imageBytes;
    var streamedResponse = await client.send(request).then((res) {
      print(res.statusCode);
    }).catchError((err) {
      print(err);
    });
    client.close();