5

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

示例用例:

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

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

4

6 回答 6

9

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

您可以使用 apache 的HTTP 客户端,它可以帮助您获取 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 并检查它,直到你得到最终的内容

本节说明如何处理重定向。

于 2009-01-23T02:36:55.120 回答
6

发出 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的 Apache 的 HTTPClient来执行 HTTP Head 请求。

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

于 2009-01-23T03:58:52.850 回答
3

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

于 2009-01-23T02:20:20.050 回答
1

这是一个没有 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();
}

遵循 mkyong.com 的重定向示例

于 2015-02-17T07:01:22.030 回答
0

我建议使用带有范围标头的 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图像。

于 2009-06-19T19:46:01.787 回答
0

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

于 2009-08-03T07:26:47.110 回答