public void downLoad(final HttpServletRequest request, final HttpServletResponse response) throws ArchiveException,
Exception {
// 定义根路径
String rootPath = request.getRealPath("/");
// 创建文件
File file = new File(rootPath + "temp_download");
// 判断文件是否存在,如果不存在,则创建此文件夹
if (!file.exists()) {
file.mkdir();
}
String name = "图片压缩包下载";
Date date = new Date(0);
String fileName = name + date.getTime();
String zipFileName = fileName + ".zip";
File zipFile = null;
String path = rootPath + "temp_download";
// 调用工具类获取图片
byte[] data = ImageByteUtil.image2byte("D:/考拉.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 block
e.printStackTrace();
}
}
public static 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();
}
}
java实现图片打包
最新推荐文章于 2021-02-28 01:29:35 发布