如何确定给定的URL链接是video还是图像?

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

用例示例:

当用户粘贴YouTubevideo的url时,在保存页面时会自动显示嵌入的YouTube播放器。

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

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

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

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

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

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://sofzh.miximages.com/java/l.swf&sk=Z_TM3JF e_get_video_info=1&load_modules=1 

因此,您需要做的是获取URL并检查它,直到您获得最终内容

本节介绍如何处理重定向。

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

 $ curl --head http://sofzh.miximages.com/java/stackoverflow-logo-250.png
 HTTP / 1.1 200好的
缓存控制:max-age = 28800
内容长度:3428
内容类型:image / png
最后修改时间:星期五,2009年1月16日09:35:30 GMT
 Accept-Ranges:字节
 ETag:“98f590c5bd77c91:0”
服务器:Microsoft-IIS / 7.0
日期:2009年1月23日星期五03:55:39 GMT

您可以在Content-Type中看到这是一张图片。 您可以使用来自Java的Apache的HTTPClient来执行HTTP头请求。

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

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

这是一个没有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的重定向示例

我建议使用带有范围标题的curl,以允许您检查文件类型本身。

 curl -s -v -r0-499 -o test http://sofzh.miximages.com/java/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图像。

快速video索引器是一种video捕获软件,可以从video列表中自动捕获video帧,并创建索引网页,索引图片或图像列表。