【问题标题】:How to determine if a given URL link is a video or image?如何确定给定的 URL 链接是视频还是图像?
【发布时间】:2010-10-03 01:36:02
【问题描述】:

我正在尝试获取用户输入的给定 URL,并确定该 URL 是指向图像还是视频。

示例用例:

当用户粘贴 YouTube 视频的 URL 时,保存页面将自动显示嵌入的 YouTube 播放器。

当用户在 Flickr 中发布图片的 URL 时,保存时,页面将自动显示 Flickr 图片的较小版本。

【问题讨论】:

    标签: java url grails http-headers


    【解决方案1】:

    您可以获取 URL 并从响应中查看 Content-type。

    您可以使用来自 apache 的 HTTP Client,它可以帮助您获取 URL 的内容,并且您可以使用它来导航重定向。例如尝试获取以下内容:

    http://www.youtube.com/watch?v=d4LkTstvUL4

    将返回包含视频的 HTML。过了一会儿你会发现视频在这里:

    http://www.youtube.com/v/d4LkTstvUL4

    但是,如果您获取该页面,您将获得重定向:

    HTTP/1.0 302 Redirect
    Date: Fri, 23 Jan 2009 02:25:37 GMT
    Content-Type: text/plain
    Expires: Fri, 23 Jan 2009 02:25:37 GMT
    Cache-Control: no-cache
    Server: Apache
    X-Content-Type-Options: nosniff
    Set-Cookie: VISITOR_INFO1_LIVE=sQc75zc-QSU; path=/; domain=.youtube.com; expires=
    Set-Cookie: VISITOR_INFO1_LIVE=sQc75zc-QSU; path=/; domain=.youtube.com; expires=
    Location: http://www.youtube.com/swf/l.swf?swf=http%3A//s.ytimg.com/yt/swf/cps-vf
    L4&rel=1&eurl=&iurl=http%3A//i1.ytimg.com/vi/d4LkTstvUL4/hqdefault.jpg&sk=Z_TM3JF
    e_get_video_info=1&load_modules=1
    

    所以,您要做的就是获取 URL 并检查它,直到获得最终内容

    This section 解释了如何处理重定向。

    【讨论】:

      【解决方案2】:

      发出 HTTP HEAD 请求,这样您就可以检查返回的 HTTP 标头,而无需先下载整个文档。展示Linux下使用“curl”的非编程案例:

      $ curl --head http://stackoverflow.com/Content/Img/stackoverflow-logo-250.png HTTP/1.1 200 正常 缓存控制:max-age=28800 内容长度:3428 内容类型:图片/png 最后修改时间:格林威治标准时间 2009 年 1 月 16 日星期五 09:35:30 接受范围:字节 ETag:“98f590c5bd77c91:0” 服务器:Microsoft-IIS/7.0 日期:格林威治标准时间 2009 年 1 月 23 日星期五 03:55:39

      从 Content-Type 可以看出这是一张图片。您可以使用 Java 中的 HTTPClient from Apache 来执行 HTTP Head 请求。

      如果您想确定下载内容,则只需发出 HTTP GET(使用 Httpclient)并使用相同的 HTTP Header 来确定内容类型。

      【讨论】:

        【解决方案3】:

        点击链接并检查内容类型标题?如果结果是 HTML 页面,您可以在页面上查找最大的图像或嵌入的 Flash 文件并选择显示它吗?

        【讨论】:

        • 谢谢!这确实是非常有用的线索。
        • 毫无疑问,我正要提出同样的建议。至于 youtube,您将被重定向到另一个地方。您应该使用 http 客户端来跟踪重定向 +1
        • 您可以尝试发出 HEAD 请求,而不是执行完整的 GET 请求并下载文件,该请求应该只返回 HTTP 标头,包括 mime 类型。这是规格:w3.org/Protocols/rfc2616/rfc2616-sec9.html
        【解决方案4】:

        这是一个没有 apache 的解决方案。

        HttpURLConnection urlConnection;
        String urlString = "http://www.youtube.com/v/oHg5SJYRHA0";
        try {
            urlConnection = (HttpURLConnection) new URL(urlString).openConnection();
            urlConnection.setInstanceFollowRedirects(true);
            HttpURLConnection.setFollowRedirects(true);
        
            int status = urlConnection.getResponseCode();
            if (status >= 300 && status <= 307) {
                urlString = urlConnection.getHeaderField("Location");
                urlConnection = (HttpURLConnection) new URL(urlString).openConnection();
                System.out.println("Redirect to URL : " + urlString);
            }
            String contentType = urlConnection.getHeaderField("Content-Type");
            if (contentType.startsWith("image/")) {
                //do something with an image
            } else if (contentType.equals("application/x-shockwave-flash")) {
                //do something with a video
                //} else ...
            }
            System.out.println(contentType);
        } catch (IOException e) {
            e.printStackTrace();
        }
        

        Follow Redirect Example from mkyong.com

        【讨论】:

          【解决方案5】:

          我建议使用带有范围标头的 curl 来检查文件类型本身。

          curl -s -v -r0-499 -o test  http://stackoverflow.com/content/img/so/logo.png
          * About to connect() to stackoverflow.com port 80 (#0)
          *   Trying 69.59.196.211... connected
          * Connected to stackoverflow.com (69.59.196.211) port 80 (#0)
          > GET /content/img/so/logo.png HTTP/1.1
          > Range: bytes=0-499
          > User-Agent: curl/7.19.4 (i386-apple-darwin9.6.0) libcurl/7.19.4 zlib/1.2.3
          > Host: stackoverflow.com
          > Accept: */*
          > 
          < HTTP/1.1 206 Partial Content
          < Cache-Control: max-age=604800
          < Content-Type: image/png
          < Content-Range: bytes 0-499/3438
          < Last-Modified: Fri, 05 Jun 2009 06:52:35 GMT
          < Accept-Ranges: bytes
          < ETag: "25dd4b35aae5c91:0"
          < Server: Microsoft-IIS/7.0
          < Date: Fri, 19 Jun 2009 19:39:43 GMT
          < Content-Length: 500
          < 
          { [data not shown]
          * Connection #0 to host stackoverflow.com left intact
          * Closing connection #0
          

          然后执行:

          $ file test
          test: PNG image data, 250 x 61, 8-bit colormap, non-interlaced
          

          现在您知道了 mime 类型:image/png,文件大小 3438 字节,文件是 250 x 61 彩色 PNG > 图像。

          【讨论】:

            【解决方案6】:

            Fast video indexer是一款视频捕捉软件,可以自动从视频列表中捕捉视频帧,并创建索引网页、索引图片或图像列表。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-07-13
              • 2016-05-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多