最近用HttpURLConnection下载一个图片的时候,下载下来死活打不开,显示文件格式已经损坏,直觉这可能是个压缩文件,于是改成用winrar打开,果不其然。
进一步查看http head的Content-Encoding,没错是gzip,浏览器发现这个gzip报文头就会自动解压,而我们自己写代码就要用GZIPInputStream来处理了。
gzip这种压缩应该对html css js那些有很好的效果,但是对大部分格式的图片没什么卵用,压缩是要服务器付出代价的。
这地址上有gzip压缩各种格式图片的测试结果:http://www.webkaka.com/blog/archives/compression-gzip-for-bmp-images.html。
import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Iterator; import java.util.Map; import java.util.zip.GZIPInputStream; public class Test { public static void main(String[] args) throws Exception { download("http://s00.qccr.com/qccr/g00/insurance/2016/09/c49c7e57d98f3893.png", "logo_7111.png", "C:/test"); } public static void download(String urlString, String filename, String savePath) throws Exception { URL url = new URL(urlString); HttpURLConnection con = (HttpURLConnection)url.openConnection(); //con.connect(); System.out.println(con.getResponseCode()); System.out.println(con.getContentLength()); Map map = con.getHeaderFields(); Iterator it = map.keySet().iterator(); boolean gzip = false; while (it.hasNext()) { Object type = map.get(it.next()); if (type.toString().indexOf("gzip") != -1) { gzip = true; break; } } System.out.println(con.getContentEncoding()); //也可以用con.getContentEncoding()来判断是否gzip System.out.println(gzip); //con.setConnectTimeout(5 * 1000); InputStream is = con.getInputStream(); byte[] bs = new byte[1024]; int len; File sf = new File(savePath); if (!sf.exists()) { sf.mkdirs(); } OutputStream os = new FileOutputStream(sf.getPath() + "/" + filename); if (!gzip) { while ( (len = is.read(bs)) != -1 ) { os.write(bs, 0, len); } } else { GZIPInputStream gis = new GZIPInputStream(is); while ( (len = gis.read(bs)) != -1 ) { os.write(bs, 0, len); } } os.flush(); os.close(); is.close(); } }
谢谢
相关推荐
JAVA通过HttpURLConnection上传和下载文件的方法 JAVA通过HttpURLConnection上传和下载文件的方法是非常有实用价值的,需要的朋友可以参考下。HttpURLConnection是一个Java类,用于从网络中读取数据或向网络中写入...
在给定的代码片段中,展示了如何使用`HttpURLConnection`进行文件下载。 首先,我们看到代码引入了`java.io`、`java.net`和`java.util`这三个包。`java.io`包含了输入/输出流,用于处理数据的读写;`java.net`包含...
在本例中,我们将探讨如何使用`HttpURLConnection`来下载图片,这是一个基础但实用的网络编程任务。下面我们将详细介绍这个过程,并涉及到的相关知识点。 1. **HttpURLConnection简介**: `HttpURLConnection`是`...
本人原创测试了百度,搜狗,360搜索都可以获取重定向后的真实地址,直接运行就可以,也可以根据自己项目具体修改功能。java使用HttpURLConnection获取百度搜狗360搜索链接重定向真实目标链接地址url。
用于对基于HTTP的服务进行抓取 HttpClient 现在是HttpComponents 把问题搞复杂了 其实Java内置的HttpURLConnection很好的 内含文档 使用方法见http: blog csdn net jdgdf566 article details 16357677
java HttpURLConnection示例 HttpURLConnection工具
在Java中,我们首先创建HttpURLConnection实例,设置连接属性,例如设置请求方法为POST,设置允许输入和输出流,并启用自动重定向。 ```java URL url = new URL("http://server.com/upload"); HttpURLConnection ...
本文详细介绍了Java 中HttpURLConnection附件上传的实例详解,包括HttpURLConnection简介、附件上传的基本原理、使用HttpURLConnection实现附件上传的示例代码分析、HttpURLConnection附件上传的优点和缺点等。...
CUrl类是一个基于Java的HttpURLConnection实现的网络通信工具,其设计灵感来源于命令行工具CUrl。CUrl命令行工具广泛用于在各种协议下发送数据,包括HTTP、HTTPS、FTP等,而CUrl类则是将这种功能移植到了Java平台,...
在这个场景下,我们将详细探讨如何使用Java原生的HttpURLConnection实现一个GET请求。 首先,我们需要了解GET请求的基本原理。GET请求是最常见的HTTP方法,用于从服务器获取资源。它将参数附加到URL中,以便服务器...
在Java编程环境中,数据压缩和传输是常见的任务,特别是在大数据处理、网络通信和文件存储等领域。Java提供了多种库和API来实现数据的压缩与解压缩,以提高存储效率和网络传输速度。本篇文章将深入探讨Java中的数据...
6. **PPT展示**:在项目报告或演示中,可以生成一个PPT来展示整个流程,包括Java批量下载文件的逻辑、MinIO的存储功能介绍以及使用`ZipOutputStream`进行文件压缩的步骤。 通过以上步骤,可以实现Java环境下从MinIO...
`HttpURLConnection`是Java标准库提供的一种轻量级的HTTP客户端,它允许我们在后台代码中发送GET和POST请求。本篇文章将深入讲解如何使用`HttpURLConnection`类来模拟浏览器请求,并通过实例展示其在接口调用中的...
这个`downloadImage`方法接受图片的URL和本地保存路径,然后使用`HttpURLConnection`下载图片并保存到指定的文件。注意,为了防止内存泄漏,我们应在读取完数据后关闭所有流,并在完成操作后断开网络连接。 在实际...
在IT行业中,Java和Android平台的网络编程一直是一个重要的领域。其中,使用HTTP协议进行网络通信是一种常见且基础的需求。***包中提供了多种处理HTTP请求的类,其中HttpURLConnection是一个较为底层且灵活的网络...
用于对基于HTTP的服务进行抓取 HttpClient 现在是HttpComponents 把问题搞复杂了 其实Java内置的HttpURLConnection很好的 内含文档 使用方法见http://blog.csdn.net/jdgdf566/article/details/17039693
使用`URL`类的`openConnection()`方法创建`HttpURLConnection`对象,然后设置连接属性,如设置连接和读取超时、禁用自动重定向等。 3. **处理重定向**: HTTPS请求可能涉及重定向,你需要检查`HttpURLConnection`...
在Java编程中,HTTPURLConnection是Java标准库提供的一种用于处理HTTP连接的类,它允许我们发送HTTP请求并接收响应。然而,HTTP协议本身是无状态的,这意味着每次请求都是独立的,不会记住之前的交互,这对于需要...
用于对基于HTTP的服务进行抓取 HttpClient 现在是HttpComponents 把问题搞复杂了 其实Java内置的HttpURLConnection很好的 内含文档 使用方法见http://blog.csdn.net/jdgdf566/article/details/17039693
需要注意的是,实际应用中可能还需要处理网络异常、超时、重试、权限等问题,以及考虑性能优化,比如压缩图片以减少上传大小,或者使用Gson、OkHttp等库来简化网络请求的处理。这个appdemo应该包含了这些基本的实现...