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