Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确定给定的URL链接是视频还是图像?_Java_Url_Grails_Http Headers - Fatal编程技术网

Java 如何确定给定的URL链接是视频还是图像?

Java 如何确定给定的URL链接是视频还是图像?,java,url,grails,http-headers,Java,Url,Grails,Http Headers,我试图获取用户输入的给定URL,并确定该URL是否指向图像或视频 示例用例: 当用户粘贴到YouTube视频的URL时,在保存页面时,将自动显示嵌入的YouTube播放器 当用户在Flickr中发布图片的URL时,保存时,页面将自动显示较小版本的Flickr图像。点击链接并检查内容类型标题?如果结果是HTML页面,您可以在页面上查找最大的图像或嵌入的flash文件,并选择显示该文件?您可以获取URL并从响应中查看内容类型 您可以从apache使用,它可以帮助您获取URL的内容,并且您可以使用它来

我试图获取用户输入的给定URL,并确定该URL是否指向图像或视频

示例用例:

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


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

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

您可以获取URL并从响应中查看内容类型

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

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

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

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并检查它,直到获得最终内容


说明如何处理重定向。

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

$curl——头http://stackoverflow.com/Content/Img/stackoverflow-logo-250.png HTTP/1.1200ok 缓存控制:最大年龄=28800 内容长度:3428 内容类型:图像/png 最后修改:2009年1月16日星期五09:35:30 GMT 接受范围:字节 ETag:“98f590c5bd77c91:0” 服务器:Microsoft IIS/7.0 日期:2009年1月23日星期五03:55:39 GMT 从内容类型可以看出这是一个图像。您可以使用fromJava来执行HTTP头请求


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

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

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

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

这是一种没有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();
}
HttpURLConnection-urlConnection;
字符串URL字符串=”http://www.youtube.com/v/oHg5SJYRHA0";
试一试{
urlConnection=(HttpURLConnection)新URL(urlString).openConnection();
urlConnection.setInstanceFlowRedirects(true);
HttpURLConnection.setFollowRedirects(true);
int status=urlConnection.getResponseCode();

如果(状态>=300&&status谢谢!这确实是非常有用的线索。最肯定的是,我正要提出同样的建议。对于youtube,您将被重定向到另一个地方。您应该使用http客户端来跟踪重定向+1而不是执行完整的get请求并下载文件,您可以尝试发出HEAD请求-这应该只是return HTTP头,包括mime类型。规范如下:
$ file test
test: PNG image data, 250 x 61, 8-bit colormap, non-interlaced
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();
}