`
halloffame
  • 浏览: 55813 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java用HttpURLConnection和GZIPInputStream下载gzip压缩的图片

    博客分类:
  • java
阅读更多

最近用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();
    }
}

谢谢

0
0
分享到:
评论

相关推荐

    JAVA通过HttpURLConnection 上传和下载文件的方法

    JAVA通过HttpURLConnection上传和下载文件的方法 JAVA通过HttpURLConnection上传和下载文件的方法是非常有实用价值的,需要的朋友可以参考下。HttpURLConnection是一个Java类,用于从网络中读取数据或向网络中写入...

    HttpURLConnection文件下载\httpURLConnection文件下载

    在给定的代码片段中,展示了如何使用`HttpURLConnection`进行文件下载。 首先,我们看到代码引入了`java.io`、`java.net`和`java.util`这三个包。`java.io`包含了输入/输出流,用于处理数据的读写;`java.net`包含...

    使用HttpURLConnection下载图片

    在本例中,我们将探讨如何使用`HttpURLConnection`来下载图片,这是一个基础但实用的网络编程任务。下面我们将详细介绍这个过程,并涉及到的相关知识点。 1. **HttpURLConnection简介**: `HttpURLConnection`是`...

    java使用HttpURLConnection获取百度搜狗360搜索链接重定向真实目标链接地址url

    本人原创测试了百度,搜狗,360搜索都可以获取重定向后的真实地址,直接运行就可以,也可以根据自己项目具体修改功能。java使用HttpURLConnection获取百度搜狗360搜索链接重定向真实目标链接地址url。

    Java的HttpURLConnection的封装类

    用于对基于HTTP的服务进行抓取 HttpClient 现在是HttpComponents 把问题搞复杂了 其实Java内置的HttpURLConnection很好的 内含文档 使用方法见http: blog csdn net jdgdf566 article details 16357677

    java HttpURLConnection工具

    java HttpURLConnection示例 HttpURLConnection工具

    Java自带的HttpURLConnection访问接口实现文件上传

    在Java中,我们首先创建HttpURLConnection实例,设置连接属性,例如设置请求方法为POST,设置允许输入和输出流,并启用自动重定向。 ```java URL url = new URL("http://server.com/upload"); HttpURLConnection ...

    Java 中HttpURLConnection附件上传的实例详解

    本文详细介绍了Java 中HttpURLConnection附件上传的实例详解,包括HttpURLConnection简介、附件上传的基本原理、使用HttpURLConnection实现附件上传的示例代码分析、HttpURLConnection附件上传的优点和缺点等。...

    CUrl类是以命令行工具CUrl为参考使用标准Java的HttpURLConnection实现的Http工具类

    CUrl类是一个基于Java的HttpURLConnection实现的网络通信工具,其设计灵感来源于命令行工具CUrl。CUrl命令行工具广泛用于在各种协议下发送数据,包括HTTP、HTTPS、FTP等,而CUrl类则是将这种功能移植到了Java平台,...

    android使用Java原生httpUrlConnection进行get请求

    在这个场景下,我们将详细探讨如何使用Java原生的HttpURLConnection实现一个GET请求。 首先,我们需要了解GET请求的基本原理。GET请求是最常见的HTTP方法,用于从服务器获取资源。它将参数附加到URL中,以便服务器...

    java数据压缩传输

    在Java编程环境中,数据压缩和传输是常见的任务,特别是在大数据处理、网络通信和文件存储等领域。Java提供了多种库和API来实现数据的压缩与解压缩,以提高存储效率和网络传输速度。本篇文章将深入探讨Java中的数据...

    Java实现批量下载并压缩文件.pptx.pptx

    6. **PPT展示**:在项目报告或演示中,可以生成一个PPT来展示整个流程,包括Java批量下载文件的逻辑、MinIO的存储功能介绍以及使用`ZipOutputStream`进行文件压缩的步骤。 通过以上步骤,可以实现Java环境下从MinIO...

    java后台调用HttpURLConnection类模拟浏览器请求实例(可用于接口调用)

    `HttpURLConnection`是Java标准库提供的一种轻量级的HTTP客户端,它允许我们在后台代码中发送GET和POST请求。本篇文章将深入讲解如何使用`HttpURLConnection`类来模拟浏览器请求,并通过实例展示其在接口调用中的...

    HttpURLConnection访问网页下载图片示例代码

    这个`downloadImage`方法接受图片的URL和本地保存路径,然后使用`HttpURLConnection`下载图片并保存到指定的文件。注意,为了防止内存泄漏,我们应在读取完数据后关闭所有流,并在完成操作后断开网络连接。 在实际...

    java android httpURLConnection的封装

    在IT行业中,Java和Android平台的网络编程一直是一个重要的领域。其中,使用HTTP协议进行网络通信是一种常见且基础的需求。***包中提供了多种处理HTTP请求的类,其中HttpURLConnection是一个较为底层且灵活的网络...

    Java的HttpURLConnection的封装类 v3.0

    用于对基于HTTP的服务进行抓取 HttpClient 现在是HttpComponents 把问题搞复杂了 其实Java内置的HttpURLConnection很好的 内含文档 使用方法见http://blog.csdn.net/jdgdf566/article/details/17039693

    java实现多次HttpURLConnection共享session

    在Java编程中,HTTPURLConnection是Java标准库提供的一种用于处理HTTP连接的类,它允许我们发送HTTP请求并接收响应。然而,HTTP协议本身是无状态的,这意味着每次请求都是独立的,不会记住之前的交互,这对于需要...

    java访问https网址下载文件(含证书)

    使用`URL`类的`openConnection()`方法创建`HttpURLConnection`对象,然后设置连接属性,如设置连接和读取超时、禁用自动重定向等。 3. **处理重定向**: HTTPS请求可能涉及重定向,你需要检查`HttpURLConnection`...

    Java的HttpURLConnection的封装类version 1.0.1_00

    用于对基于HTTP的服务进行抓取 HttpClient 现在是HttpComponents 把问题搞复杂了 其实Java内置的HttpURLConnection很好的 内含文档 使用方法见http://blog.csdn.net/jdgdf566/article/details/17039693

    android HttpURLConnection上传图片demo

    需要注意的是,实际应用中可能还需要处理网络异常、超时、重试、权限等问题,以及考虑性能优化,比如压缩图片以减少上传大小,或者使用Gson、OkHttp等库来简化网络请求的处理。这个appdemo应该包含了这些基本的实现...

Global site tag (gtag.js) - Google Analytics