java zip文件上传_java上传图片到数据库,涉及压缩文件zip/rar上传等

这是一个关于如何使用Java处理文件上传,特别是压缩文件(zip/rar)并将其内容图片存储到数据库的示例。代码包括了从MultipartFile接收文件,解压缩zip和rar文件,读取内容,裁剪图片并保存为缩略图,以及插入数据库的操作。
摘要由CSDN通过智能技术生成

packagecom.cy.controller;importjava.io.BufferedInputStream;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.io.UnsupportedEncodingException;importjava.nio.charset.Charset;importjava.sql.Blob;importjava.sql.SQLException;importjava.util.Enumeration;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.zip.ZipEntry;importjava.util.zip.ZipFile;importjava.util.zip.ZipInputStream;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.commons.fileupload.FileItem;importorg.apache.commons.fileupload.disk.DiskFileItem;importorg.apache.log4j.Logger;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.multipart.MultipartFile;importorg.springframework.web.multipart.MultipartHttpServletRequest;importorg.springframework.web.multipart.commons.CommonsMultipartFile;importorg.springframework.web.multipart.commons.CommonsMultipartResolver;importorg.springframework.web.servlet.ModelAndView;importcom.cy.constant.Result;importcom.cy.model.ImageFile;importcom.cy.model.Product;importcom.cy.service.ProductService;importcom.cy.util.FileUtil;importcom.cy.util.ImageUtil;importcom.cy.vo.VoImageFile;importde.innosystec.unrar.Archive;importde.innosystec.unrar.exception.RarException;importde.innosystec.unrar.rarfile.FileHeader;importde.innosystec.unrar.rarfile.MainHeader;

@Controllerpublic classProductController {private static Logger logger = Logger.getLogger(ProductController.class);

@AutowiredprivateProductService productService;//增加产品页面

@RequestMapping("/toAddProduct")publicModelAndView toAddProduct(){

ModelAndView mv= newModelAndView();

mv.setViewName("addProduct");returnmv;

}//增加产品

@RequestMapping("/addProduct")

@ResponseBodypublicString addProduct(String productFamily, String productType, String productSeries, String icon,

String downloadPic

){

Product p= newProduct(productFamily, productType, productSeries, icon, downloadPic);boolean result =productService.addProduct(p);if(result){return "success";

}return "failed";

}//上传图片包页面

@RequestMapping("/toAddImageFile")publicModelAndView toAddImageFile(){

ModelAndView mv= newModelAndView();

mv.setViewName("addImageFile");returnmv;

}//根据产品族、产品类型、产品系列 展示图片

@RequestMapping("/product")publicModelAndView product(String productFamily, String productType, String productSeries){// http://localhost:8080/MySSM/product?productFamily=传送网&productType=OWM&productSeries=MA6000//productFamily = "接入网";//productType = "OLT";//productSeries = "MA5800";

try{

productFamily= new String(productFamily.getBytes("iso-8859-1"), "utf-8");

}catch(UnsupportedEncodingException e) {

e.printStackTrace();

}

ModelAndView mv= newModelAndView();

List voImageFiles =productService.getImageFiles(productFamily, productType, productSeries);

mv.setViewName("product");

mv.addObject("voImageFiles", voImageFiles);returnmv;

}//显示图片

@RequestMapping("/showImage")public voidshowImage(HttpServletRequest request, HttpServletResponse response, String packageName, String pictureName){try{

pictureName= new String(pictureName.getBytes("iso-8859-1"), "utf-8");

packageName= new String(packageName.getBytes("iso-8859-1"), "utf-8");

}catch(UnsupportedEncodingException e) {

e.printStackTrace();

}

Map params = new HashMap();

params.put("packageName", packageName);

params.put("pictureName", pictureName);byte[] pic =productService.getImageByPackageNameAndPicName(params);if(pic!=null){

response.setContentType("img/jpeg");

response.setCharacterEncoding("utf-8");try{

InputStream picture= newByteArrayInputStream(pic);

OutputStream outputStream=response.getOutputStream();int len = 0;byte[] buf = new byte[1024];while((len = picture.read(buf,0,1024)) != -1){

outputStream.write(buf,0, len);

}

outputStream.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}//上传图片zip/rar文件

@RequestMapping("/uploadImageFile")

@ResponseBodypublicResult uploadImageFile(HttpServletRequest request, HttpServletResponse response){

Result result= newResult();

CommonsMultipartResolver multipartResolver= newCommonsMultipartResolver(request.getSession().getServletContext());if(multipartResolver.isMultipart(request)){

MultipartHttpServletRequest multiRequest=multipartResolver.resolveMultipart(request);

String packageType= multiRequest.getParameter("packageType");

MultipartFile file= multiRequest.getFile("imgFile");

String packageName= file.getOriginalFilename(); //上传的包名

InputStream srcInputStream = null; //上传的源文件流

try{

srcInputStream=file.getInputStream();

}catch(IOException e1) {

e1.printStackTrace();

}

File tempFile= FileUtil.saveTempFile(srcInputStream, packageName); //将上传的文件保存到本地

if(tempFile != null){if(packageType.equals("single")){ //单包

String iconName= productService.getIconNameByPackage(packageName); //获取该包下面的缩略图名称

if(packageName.matches(".*\\.zip")){ //是zip压缩文件

try{

ZipInputStream zs= new ZipInputStream(newFileInputStream(tempFile));

BufferedInputStream bs= newBufferedInputStream(zs);

ZipEntry ze;byte[] picture = null;while((ze = zs.getNextEntry()) != null){ //获取zip包中的每一个zip file entry

String fileName = ze.getName(); //pictureName

picture = new byte[(int) ze.getSize()]; //读一个文件大小

bs.read(picture, 0, (int) ze.getSize());

ImageFile image= new ImageFile(packageName, "N", fileName, picture); //保存image,非缩略图

productService.insertImage(image);if(fileName.equals(iconName)){ //这个picture要作为缩略图,进行裁剪、保存

String thumbName = ImageUtil.createThumbFileName(fileName); //生成缩略图名称

InputStream is = newByteArrayInputStream(picture);byte[] thumbPic = ImageUtil.clipImage(is, 100, 100, "jpg"); //进行裁剪

ImageFile thumbImage = new ImageFile(packageName, "Y", thumbName, thumbPic);

productService.insertImage(thumbImage);

}

}

bs.close();

zs.close();

result.setStatus("success");

}catch(IOException e){

e.printStackTrace();

}

}else if(packageName.matches(".*\\.rar")){ //是rar压缩文件

try{

Archive archive= newArchive(tempFile);

ByteArrayOutputStream bos= null;byte[] picture = null;

FileHeader fh=archive.nextFileHeader();while(fh!=null){

String fileName=fh.getFileNameString();

bos= newByteArrayOutputStream();

archive.extractFile(fh, bos);

picture=bos.toByteArray();

ImageFile image= new ImageFile(packageName, "N", fileName, picture); //保存image,非缩略图

productService.insertImage(image);

fh=archive.nextFileHeader();

}

bos.close();

archive.close();

result.setStatus("success");

}catch(RarException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

}

}else if(packageType.equals("multiple")){ //多包

if(packageName.matches(".*\\.zip")){ //多包、zip

ZipFile zipFile = null;

ZipInputStream zs= null;

BufferedInputStream bis= null;

InputStream is= null;try{

zipFile= new ZipFile(tempFile, Charset.forName("GBK"));

Enumeration extends ZipEntry> enu =zipFile.entries();

ZipEntry ze;//遍历多包下面每一个zip

while(enu.hasMoreElements()){

ze=enu.nextElement();

String zipPackageName= ze.getName(); //每个zip的包名

String iconName = productService.getIconNameByPackage(zipPackageName); //获取此zip下面的缩略图名称

zs = new ZipInputStream(zipFile.getInputStream(ze), Charset.forName("GBK")); //这个zip流

bis = newBufferedInputStream(zs);

ZipEntry ze2;//zip包下面的每一个图片

while((ze2=zs.getNextEntry()) != null){

String fileName=ze2.getName();byte[] picture = new byte[(int) ze2.getSize()];

bis.read(picture,0, (int)ze2.getSize());

ImageFile image= new ImageFile(zipPackageName, "N", fileName, picture); //保存image,非缩略图

productService.insertImage(image);if(fileName.equals(iconName)){ //这个picture要作为缩略图,进行裁剪、保存

String thumbName = ImageUtil.createThumbFileName(fileName); //生成缩略图名称

is = newByteArrayInputStream(picture);byte[] thumbPic = ImageUtil.clipImage(is, 100, 100, "jpg"); //进行裁剪

ImageFile thumbImage = new ImageFile(zipPackageName, "Y", thumbName, thumbPic);

productService.insertImage(thumbImage);

}

}

}

result.setStatus("success");

}catch(IOException e){

e.printStackTrace();

}finally{try{if(is!=null) is.close();if(bis!=null) bis.close();if(zs!=null) zs.close();if(zipFile!=null) zipFile.close();

}catch(IOException e){

e.printStackTrace();

}

}

}else if(packageName.matches(".*\\.rar")){ //多包、rar

try{

Archive archive= newArchive(tempFile);

FileHeader subFh= null;byte[] picture = null;

List fileHeaders =archive.getFileHeaders();for(FileHeader fh : fileHeaders){

String rarPackageName= fh.getFileNameString(); //子包名

String iconName = productService.getIconNameByPackage(rarPackageName); //获取该包下面的缩略图名称

FileOutputStream fos= null;

ByteArrayOutputStream bos= null;

Archive subArchive= null;if(fh.isFileHeader()){

File subFile= new File(FileUtil.TEMP + rarPackageName); //子包的临时目录

fos = newFileOutputStream(subFile);

archive.extractFile(fh, fos);//解压到临时目录 /temp/子包名

subArchive = newArchive(subFile);

subFh=subArchive.nextFileHeader();while(subFh!=null){

String picName=subFh.getFileNameString();

bos= newByteArrayOutputStream();

subArchive.extractFile(subFh, bos);

picture=bos.toByteArray();

ImageFile image= new ImageFile(rarPackageName, "N", picName, picture); //保存image,非缩略图

productService.insertImage(image);if(picName.equals(iconName)){ //这个picture要作为缩略图,进行裁剪、保存

String thumbName =ImageUtil.createThumbFileName(picName);

InputStream is= newByteArrayInputStream(picture);byte[] thumbPic = ImageUtil.clipImage(is, 100, 100, "jpg");

ImageFile thumbImage= new ImageFile(rarPackageName, "Y", thumbName, thumbPic);

productService.insertImage(thumbImage);

}

subFh=subArchive.nextFileHeader();

}if(bos!=null) bos.close(); //注意关闭相关资源,才能成功删除临时包,文件一旦被引用则删除失败

if(fos!=null) fos.close();if(subArchive!=null) subArchive.close();

FileUtil.deleteTempFile(subFile);//删除解压的临时子包

}

}

archive.close();

result.setStatus("success");

}catch(Exception e){ //catch到任何异常,返回异常

result.setStatus("exception");

e.printStackTrace();

}

}

}

FileUtil.deleteTempFile(tempFile);//临时文件使用完毕删除

}else{

result.setStatus("failed");

}

}returnresult;

}//测试rar文件读取

@RequestMapping("/testReadRar")public voidtestReadRar() {try{

File file= new File("E://MA6000-pic.rar");

Archive archive= newArchive(file);

ByteArrayOutputStream bos= null;byte[] picture = null;

FileHeader fh=archive.nextFileHeader();while(fh!=null){

String fileName=fh.getFileNameString();

bos= newByteArrayOutputStream();

archive.extractFile(fh, bos);

picture=bos.toByteArray();

ImageFile image= new ImageFile("MA6000-pic.rar", "N", fileName, picture); //保存image,非缩略图

productService.insertImage(image);

fh=archive.nextFileHeader();

}

bos.close();

archive.close();

}catch(RarException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值