项目中有这个需求:

1)上传文件通过公司平台的校验,校验成功后,通过接口,返回文件流;

2)我们根据这个文件流进行操作。这里,先将文件流复制文件到项目临时目录WEB-INF/temp;文件使用完毕,删除之;

项目中用到了下面几点:

解压zip、rar文件;

临时文件存放,使用完毕删除之;

对压缩包中的图片进行裁剪,生成预览图,并保存;

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

项目代码比较多,慢慢贴出来,不足之处欢迎指正。

1.项目结构:

2.相关代码:

ProductController:

package com.cy.controller;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.sql.Blob;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ModelAndView; import com.cy.constant.Result;
import com.cy.model.ImageFile;
import com.cy.model.Product;
import com.cy.service.ProductService;
import com.cy.util.FileUtil;
import com.cy.util.ImageUtil;
import com.cy.vo.VoImageFile; import de.innosystec.unrar.Archive;
import de.innosystec.unrar.exception.RarException;
import de.innosystec.unrar.rarfile.FileHeader;
import de.innosystec.unrar.rarfile.MainHeader; @Controller
public class ProductController { private static Logger logger = Logger.getLogger(ProductController.class); @Autowired
private ProductService productService; //增加产品页面
@RequestMapping("/toAddProduct")
public ModelAndView toAddProduct(){
ModelAndView mv = new ModelAndView();
mv.setViewName("addProduct");
return mv;
} //增加产品
@RequestMapping("/addProduct")
@ResponseBody
public String addProduct(String productFamily, String productType, String productSeries, String icon,
String downloadPic
){ Product p = new Product(productFamily, productType, productSeries, icon, downloadPic);
boolean result = productService.addProduct(p);
if(result){
return "success";
}
return "failed";
} //上传图片包页面
@RequestMapping("/toAddImageFile")
public ModelAndView toAddImageFile(){
ModelAndView mv = new ModelAndView();
mv.setViewName("addImageFile");
return mv;
} //根据产品族、产品类型、产品系列 展示图片
@RequestMapping("/product")
public ModelAndView 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 = new ModelAndView();
List<VoImageFile> voImageFiles = productService.getImageFiles(productFamily, productType, productSeries);
mv.setViewName("product");
mv.addObject("voImageFiles", voImageFiles);
return mv;
} //显示图片
@RequestMapping("/showImage")
public void showImage(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<String, String> params = new HashMap<String, String>();
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 = new ByteArrayInputStream(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")
@ResponseBody
public Result uploadImageFile(HttpServletRequest request, HttpServletResponse response){
Result result = new Result(); CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(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(new FileInputStream(tempFile));
BufferedInputStream bs = new BufferedInputStream(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 = new ByteArrayInputStream(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 = new Archive(tempFile);
ByteArrayOutputStream bos = null;
byte[] picture = null;
FileHeader fh = archive.nextFileHeader();
while(fh!=null){
String fileName = fh.getFileNameString();
bos = new ByteArrayOutputStream();
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 = new BufferedInputStream(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 = new ByteArrayInputStream(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 = new Archive(tempFile);
FileHeader subFh = null;
byte[] picture = null; List<FileHeader> 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 = new FileOutputStream(subFile);
archive.extractFile(fh, fos); //解压到临时目录 /temp/子包名
subArchive = new Archive(subFile);
subFh = subArchive.nextFileHeader(); while(subFh!=null){
String picName = subFh.getFileNameString();
bos = new ByteArrayOutputStream();
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 = new ByteArrayInputStream(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");
}
}
return result;
} //测试rar文件读取
@RequestMapping("/testReadRar")
public void testReadRar() {
try {
File file = new File("E://MA6000-pic.rar");
Archive archive = new Archive(file);
ByteArrayOutputStream bos = null;
byte[] picture = null;
FileHeader fh = archive.nextFileHeader();
while(fh!=null){
String fileName = fh.getFileNameString();
bos = new ByteArrayOutputStream();
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();
}
}
}

ProductMapper:

package com.cy.dao;

import java.sql.Blob;
import java.util.List;
import java.util.Map; import com.cy.model.ImageFile;
import com.cy.model.Product;
import com.cy.vo.VoImageFile; public interface ProductMapper {
//增加产品
public int addProduct(Product product); //保存图片
public int insertImage(ImageFile image); //根据产品族等获取图片model
public List<VoImageFile> getImageFiles(Map<String, String> params); //根据包名获取缩略图名称
public String getIconNameByPackage(String packageName); //根据包名、图片名字获取图片
public ImageFile getImageByPackageNameAndPicName(Map<String, String> params) throws Exception;
}

ProductMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.cy.dao.ProductMapper" >
<!-- 增加产品 -->
<insert id="addProduct" parameterType="com.cy.model.Product">
insert into t_product values (#{productFamily}, #{productType}, #{productSeries}, #{icon}, #{downloadPic})
</insert> <!-- 保存图片 -->
<insert id="insertImage" parameterType="com.cy.model.ImageFile">
insert into t_imagefile values (#{packageName}, #{isIcon}, #{pictureName}, #{picture})
</insert> <!-- 根据产品族等获取产品model -->
<select id="getImageFiles" parameterType="java.util.Map" resultType="com.cy.vo.VoImageFile">
select m.packageName, m.isIcon, m.pictureName from t_imagefile m
join t_product p
on m.packageName = p.downloadPic
where p.productFamily = #{productFamily} and p.productType = #{productType} and p.productSeries=#{productSeries}
</select> <!-- 根据包名获取缩略图名称 -->
<select id="getIconNameByPackage" parameterType="java.lang.String" resultType="java.lang.String">
select icon from t_product where downloadPic = #{packageName}
</select> <!-- 根据包名、图片名字获取图片 -->
<select id="getImageByPackageNameAndPicName" parameterType="java.util.Map" resultType="com.cy.model.ImageFile">
select * from t_imagefile where packageName = #{packageName} and pictureName = #{pictureName}
</select> </mapper>

Product实体:

package com.cy.model;

public class Product {
private String productFamily;
private String productType;
private String productSeries;
private String icon;
private String downloadPic; public Product(String productFamily, String productType,
String productSeries, String icon, String downloadPic) {
super();
this.productFamily = productFamily;
this.productType = productType;
this.productSeries = productSeries;
this.icon = icon;
this.downloadPic = downloadPic;
} public Product() {
super();
// TODO Auto-generated constructor stub
} public String getProductFamily() {
return productFamily;
}
public void setProductFamily(String productFamily) {
this.productFamily = productFamily;
}
public String getProductType() {
return productType;
}
public void setProductType(String productType) {
this.productType = productType;
}
public String getProductSeries() {
return productSeries;
}
public void setProductSeries(String productSeries) {
this.productSeries = productSeries;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getDownloadPic() {
return downloadPic;
}
public void setDownloadPic(String downloadPic) {
this.downloadPic = downloadPic;
} }

ImageFile实体:

package com.cy.model;

public class ImageFile {
private String packageName;
private String isIcon;
private String pictureName;
private byte[] picture; public ImageFile(String packageName, String isIcon, String pictureName,
byte[] picture) {
super();
this.packageName = packageName;
this.isIcon = isIcon;
this.pictureName = pictureName;
this.picture = picture;
} public ImageFile() {
super();
// TODO Auto-generated constructor stub
} public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public String getIsIcon() {
return isIcon;
}
public void setIsIcon(String isIcon) {
this.isIcon = isIcon;
}
public String getPictureName() {
return pictureName;
}
public void setPictureName(String pictureName) {
this.pictureName = pictureName;
}
public byte[] getPicture() {
return picture;
}
public void setPicture(byte[] picture) {
this.picture = picture;
} }

ProductService:

package com.cy.service;

import java.sql.Blob;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.cy.dao.ProductMapper;
import com.cy.model.ImageFile;
import com.cy.model.Product;
import com.cy.vo.VoImageFile; @Service
public class ProductService { @Autowired
private ProductMapper productMapper; //增加产品
public boolean addProduct(Product product){
boolean result = false;
int count = productMapper.addProduct(product);
if(count > 0){
result = true;
} return result;
} public int insertImage(ImageFile image) {
int count = productMapper.insertImage(image);
return count;
} //获取
public List<VoImageFile> getImageFiles(String productFamily, String productType, String productSeries) {
Map<String, String> params = new HashMap<String, String>();
params.put("productFamily", productFamily);
params.put("productType", productType);
params.put("productSeries", productSeries);
List<VoImageFile> imageFileList = productMapper.getImageFiles(params);
return imageFileList;
} //根据包名获取缩略图名称
public String getIconNameByPackage(String packageName) {
String iconName = productMapper.getIconNameByPackage(packageName);
return iconName;
} //根据包名、图片名字获取图片
public byte[] getImageByPackageNameAndPicName(Map<String, String> params){
byte[] pic = null;
try{
ImageFile image = productMapper.getImageByPackageNameAndPicName(params);
if(image!=null){
pic = image.getPicture();
}
}catch(Exception e){
e.printStackTrace();
}
return pic;
}
}

FileUtil.java:

package com.cy.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder; import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggerFactory; import com.cy.controller.ProductController; /**
* File工具类
* @author CY
*
*/
public class FileUtil { public static final int BYTESIZE = 1024; //每次读取的大小 1KB
public static String TEMP = null; //保存文件的临时目录 private static Logger logger = Logger.getLogger(FileUtil.class); static
{
//获取保存文件的临时目录 WEB-INF/temp/
try {
TEMP = URLDecoder.decode(FileUtil.class.getClassLoader().getResource("../temp").getPath(), "utf-8");
///E:/workspace/workspace for j2ee/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/MyTest/WEB-INF/temp/
} catch (Exception e) {
logger.error("===============>temp directory init error.. please check===============>");
e.printStackTrace();
}
} /**
* 将文件流保存在项目WEB-INF/temp目录下,并且返回这个文件;
* @param is 待转化的文件流
* @param fileName 临时文件名
* @return
* @throws IOException
*/
public static File saveTempFile(InputStream is, String fileName){
File temp = null; if(TEMP!=null && is!=null){
temp = new File(TEMP + fileName);
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try{
bis = new BufferedInputStream(is);
bos = new BufferedOutputStream(new FileOutputStream(temp)); //把文件流转为文件,保存在临时目录
int len = 0;
byte[] buf = new byte[10*BYTESIZE]; //缓冲区
while((len=bis.read(buf)) != -1){
bos.write(buf, 0, len);
}
bos.flush();
}catch(IOException e){
e.printStackTrace();
}finally{
try {
if(bos!=null) bos.close();
if(bis!=null) bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return temp;
} /**
* 删除文件 用来删除临时文件
* @param file
*/
public static void deleteTempFile(File file){
logger.warn("===============>begin delete temp file: =====================>" + file.getAbsolutePath());
boolean result = file.delete();
logger.warn("===============>delete result :===============>" + result);
} }

ImageUtil.java:

package com.cy.util;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream; import javax.imageio.ImageIO; public class ImageUtil {
/**
* 判断压缩文件的类型
*/ /**
* 生成缩略图名称
* @param srcFileName
* @return
*/
public static String createThumbFileName(String srcFileName){
StringBuffer thumbFileName = new StringBuffer(); int pos = srcFileName.lastIndexOf(".");
thumbFileName.append(srcFileName.substring(0, pos));
thumbFileName.append("_small");
thumbFileName.append(srcFileName.substring(pos, srcFileName.length()));
return thumbFileName.toString();
} /**
* 对图片进行剪裁
* @param is 图片输入流
* @param width 裁剪图片的宽
* @param height 裁剪图片的高
* @param imageFormat 输出图片的格式
* @return
*/
public static byte[] clipImage(InputStream is,int width, int height, String imageFormat){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
// 构造Image对象
BufferedImage src = javax.imageio.ImageIO.read(is);
// 缩小边长
BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 绘制 缩小 后的图片
tag.getGraphics().drawImage(src, 0, 0, width, height, null);
ImageIO.write(tag, imageFormat, bos);
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
} return bos.toByteArray();
}
}

VoImageFile:

package com.cy.vo;

public class VoImageFile {
private String packageName;
private String isIcon;
private String pictureName; public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public String getIsIcon() {
return isIcon;
}
public void setIsIcon(String isIcon) {
this.isIcon = isIcon;
}
public String getPictureName() {
return pictureName;
}
public void setPictureName(String pictureName) {
this.pictureName = pictureName;
} }

addProduct.jsp增加产品:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="resources/bootstrap/bootstrap.min.css">
<title>增加产品</title>
<style type="text/css">
.container{
margin-top: 30px;
}
</style>
</head>
<body> <div class="container">
<form class="form-horizontal" action="addProduct" method="post">
<div class="form-group form-group-sm">
<label for="inputEmail3" class="col-sm-2 control-label">产品族</label>
<div class="col-sm-10">
<input class="form-control" placeholder="产品族" name="productFamily">
</div>
</div>
<div class="form-group form-group-sm">
<label for="inputPassword3" class="col-sm-2 control-label">款型</label>
<div class="col-sm-10">
<input class="form-control" placeholder="款型" name="productType">
</div>
</div>
<div class="form-group form-group-sm">
<label for="inputPassword3" class="col-sm-2 control-label">系列</label>
<div class="col-sm-10">
<input class="form-control" placeholder="系列" name="productSeries">
</div>
</div>
<div class="form-group form-group-sm">
<label for="inputPassword3" class="col-sm-2 control-label">缩略图名称</label>
<div class="col-sm-10">
<input class="form-control" placeholder="缩略图名称" name="icon">
</div>
</div>
<div class="form-group form-group-sm">
<label for="inputPassword3" class="col-sm-2 control-label">下载PIC包名</label>
<div class="col-sm-10">
<input class="form-control" placeholder="下载PIC包名" name="downloadPic">
</div>
</div>
<div class="form-group form-group-sm">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">增加</button>
</div>
</div>
</form>
</div>
</body>
<script src="resources/js/jquery.min.js"></script>
<script src="resources/bootstrap/bootstrap.min.js"></script>
<script type="text/javascript"> </script>
</html>

addImageFile.jsp增加产品图片(上传图片):

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="resources/bootstrap/bootstrap.min.css">
<title>上传图片包文件</title>
<style type="text/css">
.container{
margin-top: 30px;
}
</style>
</head>
<body> <div class="container">
<form class="form-horizontal" action="uploadImageFile" method="post" enctype="multipart/form-data">
<div class="form-group">
<label class="col-sm-2 control-label">选择包类型:</label>
<div class="col-sm-10">
<label class="radio-inline">
<input type="radio" name="packageType" id="inlineRadio1" value="single"> 单包
</label>
<label class="radio-inline">
<input type="radio" name="packageType" id="inlineRadio2" value="multiple"> 多包
</label>
</div>
</div> <div class="form-group">
<label class="col-sm-2 control-label">选择文件:</label>
<div class="col-sm-10">
<input type="file" id="exampleInputFile" name="imgFile">
</div>
</div> <div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">上传</button>
</div>
</div>
</form>
</div>
</body>
<script src="resources/js/jquery.min.js"></script>
<script src="resources/bootstrap/bootstrap.min.js"></script>
<script type="text/javascript"> </script>
</html>

product.jsp展示图片:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="resources/bootstrap/bootstrap.min.css">
<title>产品-图片展示</title>
<style type="text/css">
.container{
margin-top: 30px;
}
.imgclass{ }
</style>
</head>
<body> <div class="container">
<div class="form-horizontal">
<c:forEach var="image" items="${voImageFiles }">
<div class="form-group form-group-sm">
<label for="inputEmail3" class="col-sm-2 control-label">包名</label>
<div class="col-sm-10">
<input class="form-control" placeholder="Email" value="${image.packageName }">
</div>
</div>
<div class="form-group form-group-sm">
<label for="inputPassword3" class="col-sm-2 control-label">图片名</label>
<div class="col-sm-10">
<input class="form-control" placeholder="Password" value="${image.pictureName }">
</div>
</div>
<div class="form-group form-group-sm">
<label for="inputPassword3" class="col-sm-2 control-label">产品图片</label>
<div class="col-sm-10">
<img class="imgclass" src="showImage?packageName=${image.packageName}&pictureName=${image.pictureName}"/>
</div>
</div>
</c:forEach>
<div class="form-group form-group-sm">
<div class="col-sm-offset-2 col-sm-10">
<a href="toAddProduct" class="btn btn-default">增加产品</a>
</div>
</div>
</div> </div>
</body>
<script src="resources/js/jquery.min.js"></script>
<script src="resources/bootstrap/bootstrap.min.js"></script>
<script type="text/javascript">
$(function(){ });
</script>
</html>

Result常量:

package com.cy.constant;

/**
* 返回的结果
* @author CY
*
*/
public class Result {
private String status;
private Object value; public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
} }

单包的定义:

多包的定义:

展示效果:

代码会上传到文件的。提供下载,因为一次只能上传10M的,lib包分两个上传了。都放进WEB-INF/lib下面就行。

项目MySSM:

链接:https://files.cnblogs.com/files/tenWood/MySSM.rar

lib1:

链接:https://files.cnblogs.com/files/tenWood/MySSM-lib1.rar

lib2:

链接:

https://files.cnblogs.com/files/tenWood/MySSM-lib2.rar

最新文章

  1. Linux5.5安装10g rac
  2. Date 对象转换——toString、toTimeString、toDateString、toUTCString、toLocaleString()、toLocaleTimeString()、toLocaleDateString()
  3. Javascript中对象的Obeject.defineProperty()方法-------------(ES5/个人理解)
  4. 怎样让js循环重复执行过程
  5. awk中怎么比较字符串??
  6. Android 代码检查工具SonarQube
  7. ORA-1653: unable to extend table SYS.AUD$
  8. 如何在linux中设置tab键长度
  9. android串行化getSerializable、getSerializableExtra
  10. Linux安装完Tomcat后无法登陆管理界面
  11. [Swift]LeetCode404. 左叶子之和 | Sum of Left Leaves
  12. visual studio 找不到模板信息
  13. mysql原生sql盘点
  14. Python 利用Python操作excel表格之openyxl介绍Part1
  15. Python3入门(一)——概述与环境安装
  16. Android热补丁技术—dexposed原理简析(阿里Hao)
  17. 【转】Oracle Sys和system用户、sysdba 和sysoper系统权
  18. 苹果iOS11重磅改版App Store,开发者应该了解这些
  19. 从如何优化SQL入手,提高数据仓库的ETL效率
  20. Luogu 4473 [国家集训队]飞飞侠

热门文章

  1. FZU 1901 Period II(KMP中的next)题解
  2. 使用 Redis
  3. MongoDB中的数据聚合工具Aggregate和Group
  4. 这些HTML、CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML、CSS、盒子模型、内容布局)
  5. Python——列表表达式
  6. Hive之GROUP BY详解
  7. ExtJs 6.0+快速入门,ext-bootstrap.js文件的分析,各版本API下载(一)
  8. jquery检测input checked 控件是否被选中的方法
  9. RabbitMQ 基础类和概念讲解
  10. maven打包资源文件(转)