【问题标题】:How to download image from ip camera in Flutter如何在 Flutter 中从 ip camera 下载图像
【发布时间】:2019-12-26 01:25:43
【问题描述】:

当我向网络摄像机 (Onvif) 发送 http 请求时

    "<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);

得到正确答案后更新。我可以看到创建摘要键所需的参数,但由于我无法通过 dart 代码返回 Response 对象 Response header in http sniffer that I can't get by Dart code

【问题讨论】:

    标签: flutter dart ip-camera onvif


    【解决方案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>");
    

    【讨论】:

    • 感谢您的回答。我收到错误:未处理的异常:FileSystemException:无法打开文件,路径 = 'image.jpg'(操作系统错误:只读文件系统,errno = 30)
    • HTTP/1.1 401 未经授权的服务器:GoAhead-Webs 日期:Thu Dec 26 05:51:48 2019 WWW-Authenticate: Digest realm="goAhead", domain=":31122",qop=" auth", nonce="cdb3f5e3d9fe4fc5768726b5920f97ba", opaque="5ccc069c403ebaf9f0171e9517f40e41",algorithm="MD5", stale="FALSE" Pragma: no-cache Cache-Control: no-cache Content-Type: text/html 文档错误:未经授权

      访问错误:未经授权

      访问此文档需要用户ID

    • 访问网址是否需要基本身份验证?
    • 你的答案是正确的,我只需要再通过一个认证步骤来获取快照
    • 你能给我一个提示,什么是在 Dart 上传递摘要身份验证的最简单方法。包括领域、随机数等参数
    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    相关资源
    最近更新 更多