Как загрузить изображение с ip-камеры во Flutter

Когда я отправляю http-запрос на IP-камеру (Onvif)

    "<GetSnapshotUri xmlns=\"http://www.onvif.org/ver20/media/wsdl\">" +
          "<ProfileToken>PROFILE_000</ProfileToken></GetSnapshotUri>";

Я получил ответ, содержащий URL:

....
 <s:Body><trt:GetSnapshotUriResponse><trt:MediaUri> 
 <tt:Uri>http://192.168.1.102:13237/snapshot.cgi</tt:Uri> 
 <tt:InvalidAfterConnect>false</tt:InvalidAfterConnect> 
 <tt:InvalidAfterReboot>false</tt:InvalidAfterReboot><tt:Timeout>PT5S</tt:Timeout></trt:MediaUri> 
 </trt:GetSnapshotUriResponse></s:Body></s:Envelope>

Я пытался использовать плагин image_downloader, но это не сработало. Я вижу его в браузере (Chrome), но не могу просмотреть через Image.network('http://192.168.1.102:13237/snapshot.cgi') Виджет

у меня ошибка

════════ Exception caught by image resource service ════════════════════════════════════════════════
The following NetworkImageLoadException was thrown resolving an image codec:
HTTP request failed, statusCode: 401, http://192.168.1.102:13237/snapshot.cgi

When the exception was thrown, this was the stack: 
#0      NetworkImage._loadAsync (package:flutter/src/painting/_network_image_io.dart:90:9)
<asynchronous suspension>
#1      NetworkImage.load (package:flutter/src/painting/_network_image_io.dart:47:14)
#2      ImageProvider.resolve.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter/src/painting/image_provider.dart:327:17)
#3      ImageCache.putIfAbsent (package:flutter/src/painting/image_cache.dart:160:22)
...
Image provider: NetworkImage("http://192.168.1.102:13237/snapshot.cgi", scale: 1.0)
Image key: NetworkImage("http://192.168.1.102:13237/snapshot.cgi", scale: 1.0)
════════════════════════════════════════════════════════════════════════════════════════════════════

Я нашел ответ на Java

URL url = new URL("http://webacm-ip-adr:8084/snapshot.cgi");
InputStream input = url.openStream();
String jpg = "sample.jpg";
FileOutputStream output = new FileOutputStream(jpg);
IOUtils.copy(input, output);

Обновлено после получения правильного ответа. Я вижу параметры, необходимые для создания ключа Digest, но из-за того, что я не могу вернуть объект Response с помощью кода дротика https://i.stack.imgur.com/SAaCH.png


person Стас Фролкин    schedule 26.12.2019    source источник


Ответы (1)


Как насчет использования вместо загрузчика изображений

import 'package:http/http.dart' as http;
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:flutter/foundation.dart';
 Future<File> _downloadFile(String authEncoded,String url, String param) async {
  final response = await http.post(url,
    headers: {
       HttpHeaders.authorizationHeader: 'Basic ' + authEncoded 
       // Do same with your authentication requirement
    },
    body: param,
  );

 response.headers.forEach((k,v) => print (k+" : "+v));
 //Your response headers here

if(response.statusCode==200){
 String dir = (await getApplicationDocumentsDirectory()).path;
  File file = new File('$dir/image.jpg');
  await file.writeAsBytes(response.bodyBytes);
  return file;
 } else {
    print("Error : " + response.statusCode.toString());
  }
}

Звоните сейчас

File file = await _downloadFile("http://192.168.1.102:13237/snapshot.cgi", "<GetSnapshotUri xmlns=\"http://www.onvif.org/ver20/media/wsdl\"><ProfileToken>PROFILE_000</ProfileToken></GetSnapshotUri>");
person Dev    schedule 26.12.2019
comment
Спасибо за ответ. Я получаю сообщение об ошибке: Необработанное исключение: FileSystemException: Невозможно открыть файл, путь = 'image.jpg' (Ошибка ОС: файловая система только для чтения, errno = 30) - person Стас Фролкин; 26.12.2019
comment
Http/1,1 401 Несанкционированный сервер: goahead-webs Дата: Чт 26 декабря 05:51:48 2019 www-authenticate: digest realm = goahead, домен =: 31122, Qop = auth, nonce = cdb3f5e3d9fc5768726b5920f97ba, opaquque3d9fc5768726B5920F97BA, opaquque3d9fc5768726b5920f97baf5.fc.fcc5768726b5920f97baf5. , stale=FALSE Прагма: no-cache Cache-Control: no-cache Content-Type: text/html ‹html›‹head›‹title›Ошибка документа: неавторизованный‹/title›‹/head› ‹body›‹h2› Ошибка доступа: неавторизованный‹/h2› ‹p›Для доступа к этому документу требуется идентификатор пользователя‹/p›‹/body›‹/html› - person Стас Фролкин; 26.12.2019
comment
есть ли какие-либо требования базовой аутентификации для доступа к URL-адресу? - person Dev; 26.12.2019
comment
Ваш ответ правильный, мне просто нужно пройти еще один шаг авторизации для получения снимка - person Стас Фролкин; 26.12.2019
comment
Не могли бы вы дать мне подсказку, как проще всего пройти дайджест-аутентификацию на Dart. включать такие параметры, как область, одноразовый номер и т. д. - person Стас Фролкин; 26.12.2019
comment
Как я могу получить заголовок ответа для параметров извлечения для создания дайджеста? окончательный ответ = ожидание http.post (url, заголовки: {}, тело: параметр,); после этого кода я ничего не получаю по выражению print(response.headers); - person Стас Фролкин; 26.12.2019
comment
я привел пример для базовой аутентификации, аналогично вы можете установить дайджест в заголовке - person Dev; 26.12.2019
comment
Да поймите это. Почему я не могу вернуть объект Response, когда делаю запрос на этот URL = 192.168.88.32:31122/snapshot. компьютерная графика. Я вижу только область, одноразовый номер и т. д. в http-сниффере. Когда я запрашиваю url = 192.168.88.32:10080. Нет проблем с получением объекта Response - person Стас Фролкин; 26.12.2019
comment
На самом деле не могу помочь, кроме этого, так как не знаю ваших точных настроек и того, какой ответ на запрос воспроизводится. Попробуйте отладить заголовки, ответы и т. д., распечатав их. - person Dev; 26.12.2019
comment
В вашем коде есть объект Response. Итак, ответ IP-камеры с кодом 401 неавторизован (я добавил скриншот сниффера в конце вопроса), но почему я не могу получить эту ошибку из объекта ответа в вашем коде? Я ничего не могу распечатать из объекта Response - person Стас Фролкин; 26.12.2019
comment
также добавлены значения заголовков ответа - person Dev; 26.12.2019
comment
Не могли бы вы помочь с моей следующей проблемой аутентификации stackoverflow.com/questions/59491178/ - person Стас Фролкин; 27.12.2019