Flutter PUT HTTP-запрос из файла - PullRequest
0 голосов
/ 23 октября 2019

Нужна помощь в устранении неполадок HTTP-запроса во Flutter с использованием метода PUT, при котором файл изображения тела отправляется на сервер NextCloud через API.

Как всегда, я протестировал отправку запроса через 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, отправляемый через приложение:

Nextcloud server 2

Похоже, что что-то не так с кодировкой или данными, которые отправляются в теле. Файл становится «поврежденным»

Это один и тот же файл в обоих тестах.

** ОБНОВЛЕНИЕ **

После изменения данных тела в байты, как это было предложенобез базового кодирования. (Изображение ниже)

Just bytes

Попытка преобразования также с использованием метода .toString (), файл перешел на сервер, но остался таким же, как и раньше, выглядел поврежденным.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Нет необходимости создавать собственный запрос, так как в пакете 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);
0 голосов
/ 24 октября 2019

@ 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...