需要一些帮助,使用PUT方法通过API将主体上的图像文件发送到NextCloud服务器,从而对Flutter中的HTTP请求进行故障排除。
和往常一样,我测试了通过POSTMAN发送请求以查看发生了什么。可以在“正文”选项卡中选择“二进制”,然后选择图像文件。
文件按预期存在:
要在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发送的结果:
看起来像是编码或身体上发送的数据有问题。文件“损坏”
两个测试中的文件相同。
**更新**
按照建议将正文数据更改为仅字节之后,不进行base64encoding。 (下图)
也尝试使用.toString()方法进行转换,该文件转到了服务器,但与以前一样,看上去已损坏。
答案 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();