Code Bye

HttpURLConnection 读取网络图片的问题

在用HttpURLConnection 读取网络图片时候 出现 404 错误 求大神指点 ?

http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg  
这个地址用浏览器打开 是可以正常访问的 但是用 HttpURLConnection  去读取 会出现 404 错误


                       URL url = new URL("http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg");
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			con.setDoInput(true);
			con.setDoOutput(true);
			con.setReadTimeout(30000);
			con.setInstanceFollowRedirects(true);
			con.addRequestProperty("Cache-Control", "no-cache");
			con.connect();
			// 在指定目录创建一个空文件并获取文件对象
			File file = new File("H:\a.jpg");
			if (file.exists()) {		file.delete();	}else{			file.createNewFile();}
			// 获取一个写入文件流对象
			String location = con.getHeaderField("Location");
			System.out.println(location);    //这里打印 null 
			System.out.println(con.getURL().toString());    //这里打印http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg
			InputStream in = con.getInputStream();   //这句出异常






5分
你看看直接访问域名有没有变,应该以能看到图片的地址栏地址为准。
直接访问 出现了一个302 的跳转 
Request URL:http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg

返回:
Connection:keep-alive
Content-Length:0
Date:Fri, 19 Sep 2014 09:08:00 GMT
Keep-Alive:timeout=5
Location:http://121.37.63.66/offerwow_staging/logo/1406880082963.jpg
Server:nginx/1.4.7 

最终浏览器显示的地址 : http://121.37.63.66/offerwow_staging/logo/1406880082963.jpg

这种302 跳转 模式  HttpURLConnection 默认就处理啊 不需要做其他的 操作  我也测试了其他的网站 给一个302的跳转链接 能正常跳转

引用 1 楼 fangmingshijie 的回复:

你看看直接访问域名有没有变,应该以能看到图片的地址栏地址为准。

求指点

那么你观察一下 http 通信的过程中重定向跳转时有没有什么 Referer 之类的东西 (引用页),有些网站在你直接 GET 时没带引用页时会拒绝服务,因此它知道你是在盗链。

找一个 Eclipse 中的 TCP/IP Monitor 视图配置一个 forwarder 来观察 Http 过程。

引用 4 楼 humanity 的回复:

那么你观察一下 http 通信的过程中重定向跳转时有没有什么 Referer 之类的东西 (引用页),有些网站在你直接 GET 时没带引用页时会拒绝服务,因此它知道你是在盗链。

找一个 Eclipse 中的 TCP/IP Monitor 视图配置一个 forwarder 来观察 Http 过程。

跳转时候 没有 Referer  但是浏览器 却能正常显示 

本帖最后由 fangmingshijie 于 2014-09-19 17:41:37 编辑

要跳转你要用一下头信息,调用responsecode  再看前后url变化就可以了。

    con.setRequestProperty("User-agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1");
     con.setRequestProperty("accept-language", "zh-CN");

System.out.println(con.getURL().toString());    //这里打印http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg
        int code=con.getResponseCode();
        System.out.println(con.getURL().toString());    //这里打印http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg
引用 6 楼 fangmingshijie 的回复:

要跳转你要用一下头信息,调用responsecode  再看前后url变化就可以了。

    con.setRequestProperty("User-agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1");
     con.setRequestProperty("accept-language", "zh-CN");

System.out.println(con.getURL().toString());    //这里打印http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg
        int code=con.getResponseCode();
        System.out.println(con.getURL().toString());    //这里打印http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg

你这里都没跳转啊  在浏览器 会出现一个 302 的跳转  
直接访问 出现了一个302 的跳转 
Request URL:http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg

返回:
Connection:keep-alive
Content-Length:0
Date:Fri, 19 Sep 2014 09:08:00 GMT
Keep-Alive:timeout=5
Location:http://121.37.63.66/offerwow_staging/logo/1406880082963.jpg
Server:nginx/1.4.7 

为什么在代码里面跳转不过去呢 


15分
URL url = new URL("http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestProperty("User-agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1");
        con.setRequestProperty("accept-language", "zh-CN");
        con.setInstanceFollowRedirects(true);
        con.addRequestProperty("Cache-Control", "no-cache");
        con.connect();
        System.out.println(con.getURL().toString());    //这里打印http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg
        int code=con.getResponseCode();
        System.out.println(con.getURL().toString());    //这里打印http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg

自己看下打印的url还不明白吗?302必须设置User-agent和accept-language,跳转是浏览器帮你的。

引用 8 楼 fangmingshijie 的回复:
URL url = new URL("http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestProperty("User-agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1");
        con.setRequestProperty("accept-language", "zh-CN");
        con.setInstanceFollowRedirects(true);
        con.addRequestProperty("Cache-Control", "no-cache");
        con.connect();
        System.out.println(con.getURL().toString());    //这里打印http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg
        int code=con.getResponseCode();
        System.out.println(con.getURL().toString());    //这里打印http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg

自己看下打印的url还不明白吗?302必须设置User-agent和accept-language,跳转是浏览器帮你的。

哦  明白了 谢谢大神 没想到 还有这么个规则 …….. 

但是我  测试其他 url   不加 这两个User-agent和accept-language    一样可以正常跳转哦  。。。 这个是为什么啊 

引用 6 楼 fangmingshijie 的回复:

要跳转你要用一下头信息,调用responsecode  再看前后url变化就可以了。

    con.setRequestProperty("User-agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1");
     con.setRequestProperty("accept-language", "zh-CN");

System.out.println(con.getURL().toString());    //这里打印http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg
        int code=con.getResponseCode();
        System.out.println(con.getURL().toString());    //这里打印http://www.offerwow.cn/image/offerwow_staging/logo/1406880082963.jpg

我试了一下事实说明 跟你这个 设置User-agent和accept-language  没有什么关系    是服务器 拦截到了 我的url 没有跳转

但是我还是谢谢你们  

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明HttpURLConnection 读取网络图片的问题