java图片的导出,并压缩

java图片的导出,并压缩

java 压缩包jar包使用的是commons-compress-1.6.jar

/*** 导出图片* @param request* @param response*/@RequestMapping("/exportPicture")public void exportPicture(HttpServletRequest request,HttpServletResponse response) throws Exception {//定义根路径String rootPath = request.getRealPath("/");//@Test测试,rootPath 可直接写路径 eg://String rootPath = "D:\\a.jpg";//创建文件File file = new File(rootPath+"temp_download");//判断文件是否存在,如果不存在,则创建此文件夹if(!file.exists()){file.mkdir();}String name = "图片压缩包下载";String fileName = name+new Date().getTime();String zipFileName = fileName + ".zip";File zipFile = null;String path = rootPath + "temp_download";//调用工具类获取图片byte[] data = ImageByteUtil.image2byte("F:\\blank.jpg");//new一个文件对象用来保存图片,默认保存当前工程根目录  if(data != null){File imageFile = new File(path+File.separator+fileName+".jpg");  //创建输出流  FileOutputStream outStream = new FileOutputStream(imageFile);  //写入数据  outStream.write(data);  //关闭输出流  outStream.close();}try {//获取创建好的图片文件File imageFile = new File(path+"/"+fileName+".jpg");// 打成压缩包zipFile = new File(path + "/" + zipFileName);FileOutputStream zipFos = new FileOutputStream(zipFile);ArchiveOutputStream archOut = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, zipFos);if (archOut instanceof ZipArchiveOutputStream) {ZipArchiveOutputStream zos = (ZipArchiveOutputStream) archOut;ZipArchiveEntry zipEntry = new ZipArchiveEntry(imageFile, imageFile.getName());zos.putArchiveEntry(zipEntry);zos.write(FileUtils.readFileToByteArray(imageFile));zos.closeArchiveEntry();zos.flush();zos.close();}// 压缩完删除txt文件if (imageFile.exists()) {imageFile.delete();}// 输出到客户端OutputStream out = null;out = response.getOutputStream();response.reset();response.setHeader("Content-Disposition", "attachment;filename=" + new String(zipFileName.getBytes("GB2312"), "ISO-8859-1"));response.setContentType("application/octet-stream; charset=utf-8");response.setCharacterEncoding("UTF-8");out.write(FileUtils.readFileToByteArray(zipFile));out.flush();out.close();//测试就不要输出到客户端了,把下面这段删除压缩包的代码注释掉,//就能看到效果了// 输出客户端结束后,删除压缩包if (zipFile.exists()) {zipFile.delete();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ArchiveException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

附工具类 ImageByteUtil 图片与byte数组互转util

public class ImageByteUtil {/*** 实现图片与byte数组之间的互相转换* @param args*/public static void main(String[] args) {//定义路径String path = "F:\\blank.jpg";byte[] data = image2byte(path);System.out.println(data.length);}/*** 将图片转换为byte数组* @param path 图片路径* @return*/public static byte[] image2byte(String path){//定义byte数组byte[] data = null;//输入流FileImageInputStream input = null;try {input = new FileImageInputStream(new File(path));ByteArrayOutputStream output = new ByteArrayOutputStream();byte[] buf = new byte[1024];int numBytesRead = 0;while ((numBytesRead = input.read(buf)) != -1) {output.write(buf, 0, numBytesRead);}data = output.toByteArray();output.close();input.close();}catch (FileNotFoundException ex1) {ex1.printStackTrace();}catch (IOException ex1) {ex1.printStackTrace();}return data;}//byte数组到图片public void byte2image(byte[] data,String path){if(data.length<3||path.equals("")) return;try{FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));imageOutput.write(data, 0, data.length);imageOutput.close();System.out.println("Make Picture success,Please find image in " + path);} catch(Exception ex) {System.out.println("Exception: " + ex);ex.printStackTrace();}}//byte数组到16进制字符串public String byte2string(byte[] data){if(data==null||data.length<=1) return "0x";if(data.length>200000) return "0x";StringBuffer sb = new StringBuffer();int buf[] = new int[data.length];//byte数组转化成十进制for(int k=0;k<data.length;k++){buf[k] = data[k]<0?(data[k]+256):(data[k]);}//十进制转化成十六进制for(int k=0;k<buf.length;k++){if(buf[k]<16) sb.append("0"+Integer.toHexString(buf[k]));else sb.append(Integer.toHexString(buf[k]));}return "0x"+sb.toString().toUpperCase();} }

本文复制参考:http://blog.csdn.net/u012151597/article/details/52945560?locationNum=4&fps=1
感谢作者”洋葱花瓣”的整理.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux系统基础】(3)在Linux上部署运维监控Zabbix和Grafana

目录 运维监控Zabbix部署简介安装安装前准备 - Mysql安装Zabbix Server 和 Zabbix Agenta. 安装Zabbix yum库b. 安装Zabbix Server、前端、Agentc. 初始化Mysql数据库d. 为Zabbix Server配置数据库e. 配置Zabbix的PHP前端 配置zabbix 前端&#xff08;WEB UI&#xff09; 运维监…

Pods简介

每种语言发展到一个阶段&#xff0c;就会出现相应的依赖管理工具&#xff0c;例如 Java 语言的 Maven&#xff0c;nodejs 的 npm。随着 iOS 开发者的增多&#xff0c;业界也出现了为 iOS 程序提供依赖管理的工具&#xff0c;它的名字叫做&#xff1a;CocoaPods。 CocoaPods项目…

HashMap源码解释

HashMap 前言: 本文的hashMap是基于jdk1.7的hashMap. 关于jdk1.8的hashMap在另一篇中,那里将会介绍与1.7的差异与优势 首先基础知识介绍: 1.HashMap的成员变量   int DEFAULT_INITIAL_CAPACITY 16&#xff1a;默认的初始容量为2 ^ 4   int MAXIMUM_CAPACITY 1 <<…

MagicRecord For IOS 简介

一、概述 MagicalRecord 灵感来自于简洁的Ruby语言中 Rails Active Record 查询方式. MagicalRecord 这个开源库的核心思想是: 1.清除 Core Data 相关的代码2.简洁的清除,简单的一行搜索记录的功能3.当然允许使用NSFetchRequest,当存在着复杂的搜索条件时 二、使用 1. 导入框架…

对象引用 String引用 基本类型引用 差别

最近遇到一个线上问题,原因是忽略的引用的一些语法,导致出错,现在记录一下: Testpublic void testList(){List<String> list new ArrayList<String>();list.add("1");list.add("2");list.add("3");List<String> list2 new …

Mantle For iOS

Mantle可以很方便的去书写一个模型层的代码。 使用它可以很方便的去反序列化JSON或者序列化为JSON(需要在MTLModel子类中实现<MTLJSONSerializing>协议) 使用一个解释器MTLJSONAdapter去转换模型对象。 NSError *error nil; MyObject *myObject [MTLJSONAdapter modelO…

String的split方法的使用

1.引言 split方法很常用,记得我入职公司的时候,第一道笔试题就是关于字符串的拆分拼装等,这也足以说明,大公司对这些方法的重视程度. 其实我们平时一般用到的都是这些方法最简单的用法,但如果你不了解他的实现原理,碰到某些特殊问题终究是会被卡住的,于是就产生了所谓的bug,而…

ReactiveCocoa入门

概述 为什么要使用RAC&#xff1f;一个怪怪的东西&#xff0c;从Demo看也没有让代码变得更好、更短&#xff0c;相反还造成理解上的困难&#xff0c;真的有必要去学它么&#xff1f;相信这是大多数人在接触RAC时的想法。RAC不是单一功能的模块&#xff0c;它是一个Framework&am…

[前台]---input标签中的hidden,浏览器差异问题

前言: 这是一个比较简单的问题,也有人犯过这样的错误,如果你是一个人在编码,并且没有专门的去测试浏览器差异,这个或许会坑到你 问题描述: 用input标签的时候,需要把这个input隐藏掉,于是先这样做: <input hidden id"xxx" value"xxx"/> 这行代码…

C++和Objective-C混编(官方文档翻译)

苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C和Objective-C&#xff0c;混编后的语言叫Objective-C。有了它&#xff0c;你就可以在Objective-C应用程序中使用已有的C类库。 Build Setting中要设定编译文件类型设置&#xff0c;如下图&#xff1a;Objectiv…

SpringMVC获取response的问题

SpringMVC获取response的问题: 关于用以下这种方式获取response的一些问题: ((ServletWebRequest) RequestContextHolder.getRequestAttributes()).getResponse(); 网上对于这种方式获取response的描述很多,我用的是jar包版本是3.2.9.release web.xml中肯定也是加了Request…

BigDecimal的个人总结

前言: 互联网公司,对于BigDecimal的使用,还是较为频繁的,那么就会涉及到关于这个类型的种种问题. 1:为什么使用BigDecimal 首先java八大基本类型真的很基本,4个整型搞不了小数,double和float搞的了小数,但搞不好,关键时刻就调链子,当然这也和他们存储方式有关(二进制无法精确的…

MagicRecord For IOS API深层解析

一、NSManagedObjectContext创建和获取1.默认上下文(每种只存在一个)&#xff08;1&#xff09;MR_rootSavingContext&#xff1a;此方法返回的上下文类型为NSPrivateQueueConcurrencyType(后台线程)&#xff0c;直接关联持久化协调器&#xff0c;对此上下文对象执行保存方法&a…

BeanUtils.copyProperties(对象A,对象B)

对于两个实例的复制,如果属性名字相同,则可以通过这个方法来操作,但是在使用的时候,一定要注意BeanUtils用的是哪个包的,因为常用的两个包,都有这个类和对应的方法,而复制方向却相反,所以一定要注意自动导包时选择的包!!!!!! 1.import org.springframework.beans.BeanUtils 这…

Xcode中的-ObjC和-all_load

有时候使用第三方库的时候&#xff0c;需要在Xcode的Build Settings下Other Linker Flags里面加入-ObjC标志。 之所以使用该标志&#xff0c;和Objective-C的一个重要特性&#xff1a;类别&#xff08;category)有关。根据这里的解释&#xff0c;Unix的标准静态库实现和Object…

[前台]---ajax返回200成功,却进入error函数的解决方法

最近碰到一个问题,就是如题目所说,ajax在调用的时候,明明返回成功了,但js代码却走到了error中,最后发现是我返回的json格式不对,jQuery在1.4后,对ajax返回的json格式有了很强的限制,所以一定要用严格的JSON格式返回. 先上代码: jQuery.ajax({type: "POST",async: tr…

SpringMVC解决静态资源不能访问

解决: 直接在SpringMVC的xml文件中加一行配置: <mvc:default-servlet-handler/> 问题根源: 做项目迁移的时候,原来控制层的框架是Struts2,现在要换成SpringMVC,第一版是尽量少改动的移过去,保证功能都正常,第二版开始优化,于是: 原来项目的访问都是XXX.action,现在想…

CocoaPods版本升级

和往常一样使用CocoaPods管理一个基于FMDB的项目类库 命令行执行 $ pod install [!] The master repo requires CocoaPods 0.32.1 - 失败&#xff0c;提示需要CocoaPods 0.32.1版本 查看CocoaPods版本 $ pod --version 0.29.0 确实需要更新了 命令行更新&#xff08;安装&…

[前台]---js获取input标签中name相同的各个value值

在页面form表单中,经常会有相同name的多个input标签,在提交表单前需要对这些input的value值做校验,就要在js中拿到这些值,下面这个方法,亲测是最实在的: 页面:<input type"hidden" name"myname" value"aa"/><input type"hidden&qu…

Objective-C消息转发

我们要通过一个小例子来简单、通俗的理解一下什么是消息转发以及如何消息转发&#xff0c;希望看完这篇文章时大家会彻底的明白OC的消息。首先&#xff0c;你需要知道这两个概念&#xff1a; OC中调用方法就是向对象发送消息。 比如 &#xff1a; 1[person run];这实际上这是在…