http://blog.csdn.net/mmm333zzz/article/details/8569637 谢谢
近段时间在运用了spring mvc+spring3.x+mybatis3.x框架开发项目,碰到一个问题,上传图片并生成缩略图。在网上找了很多资料都没有看到我想要的功能,要不就单纯上传图片,而且代码简单没什么实用处。要不就是上传文件,不是我想找的。记得之前struts2也有上传图片生成高清缩略图的功能,于是看了看,有两种方法,不过大同小异。代码如下
以下是struts2也有上传图片哦。 如果要看 spring mvc上传图片 请直接拉下下
第一种:清晰度不高;
UploadAction
更多学习资料请访问 https://www.itkc8.com
[java] view plaincopyprint?
- package com.lanyuan.upload;
- import java.io.File;
- import com.opensymphony.xwork2.ActionSupport;
- public class UploadAction extends ActionSupport {
- private static final long serialVersionUID = -8204063374280945416L;
- private File upload;// 路径
- private String uploadFileName;// 原文件名
- private String uploadContentType;// 文件类型
- public String upload() throws Exception {
- UploadUtil uploadutil = new UploadUtil();
- uploadutil.uploadImage1(getUpload(), getUploadContentType(), getUploadFileName());
- return "success";
- }
- public File getUpload() {
- return upload;
- }
- public void setUpload(File upload) {
- this.upload = upload;
- }
- public String getUploadFileName() {
- return uploadFileName;
- }
- public void setUploadFileName(String uploadFileName) {
- this.uploadFileName = uploadFileName;
- }
- public String getUploadContentType() {
- return uploadContentType;
- }
- public void setUploadContentType(String uploadContentType) {
- this.uploadContentType = uploadContentType;
- }
- }
/**
*
* 上传图片 工具类
* 大图片路径,生成小图片路径,
* 大图片文件名,生成小图片文名,
* 生成小图片宽度,生成小图片高度,
* 是否等比缩放(默认为true))
*
* @author Administrator
*
*/
UploadUtil
[java] view plaincopyprint?
- package com.lanyuan.upload;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Random;
- import org.apache.struts2.ServletActionContext;
- /**
- *
- * 上传图片 工具类
- * 大图片路径,生成小图片路径,
- * 大图片文件名,生成小图片文名,
- * 生成小图片宽度,生成小图片高度,
- * 是否等比缩放(默认为true))
- *
- * @author Administrator
- *
- */
- public class UploadUtil {
- private String imagePath = "/image/"+new SimpleDateFormat("yyyyMMddHH").format(new Date())+"";// 配置图片路径
- private String image_smallPath = "/image_small/"+new SimpleDateFormat("yyyyMMddHH").format(new Date())+"";// 配置小图片路径
- /**
- *
- * @param request /
- * @param getUpload 路径
- * @param getUploadContentType 文件类型
- * @param getUploadFileName 原文件名
- * @return
- * @throws IOException
- */
- public void uploadImage1(File getUpload, String getUploadContentType, String getUploadFileName) throws IOException {
- String getImagePath = ServletActionContext.getServletContext().getRealPath(imagePath);
- String getImage_smallPath = ServletActionContext.getServletContext().getRealPath(image_smallPath);
- File image = new File(getImagePath);
- if (!image.exists()) {
- image.mkdir();
- }
- File image_small = new File(getImage_smallPath);
- if (!image_small.exists()) {
- image_small.mkdir();
- }
- // 得到上传文件的后缀名
- String uploadName = getUploadContentType;
- System.out.println("图片类型 ------------"+uploadName);
- String lastuploadName = uploadName.substring(
- uploadName.indexOf("/") + 1, uploadName.length());
- System.out.println("得到上传文件的后缀名 ------------"+lastuploadName);
- // 得到文件的新名字
- String fileNewName = generateFileName(getUploadFileName);
- System.out.println("// 得到文件的新名字 ------------"+fileNewName);
- FileOutputStream fos = new FileOutputStream(getImagePath + "/" + fileNewName);
- FileInputStream fis = new FileInputStream(getUpload);
- byte[] buffer = new byte[1024];
- int len = 0;
- while ((len = fis.read(buffer)) > 0) {
- fos.write(buffer, 0, len);
- }
- DwindlePic mypic = new DwindlePic();
- mypic.s_pic(getImagePath + "/", getImage_smallPath + "/", fileNewName, fileNewName, 110, 110, false);
- //最后返回图片路径
- imagePath = imagePath+"/"+fileNewName;
- image_smallPath = image_smallPath+"/"+fileNewName;
- }
- /**
- * 传入原图名称,,获得一个以时间格式的新名称
- * @param fileName 原图名称
- * @return
- */
- private String generateFileName(String fileName) {
- DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
- String formatDate = format.format(new Date());
- int random = new Random().nextInt(10000);
- int position = fileName.lastIndexOf(".");
- String extension = fileName.substring(position);
- return formatDate + random + extension;
- }
- public String getImagepath() {
- return imagePath;
- }
- public String getImageSmallpath() {
- return image_smallPath;
- }
- }
大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
DwindlePic
[java] view plaincopyprint?
- package com.lanyuan.upload;
- import java.io.*;
- import com.sun.image.codec.jpeg.*;
- import java.awt.image.*;
- import java.awt.*;
- import java.applet.*;
- /**
- * s_pic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
- *
- * @author Administrator
- *
- */
- public class DwindlePic {
- String InputDir; // 输入图路径
- String OutputDir; // 输出图路径
- String InputFileName; // 输入图文件名
- String OutputFileName; // 输出图文件名
- int OutputWidth = 110; // 默认输出图片宽
- int OutputHeight = 110; // 默认输出图片高
- int rate = 0;
- boolean proportion = true; // 是否等比缩放标记(默认为等比缩放)
- public DwindlePic() {
- // 初始化变量
- InputDir = "";
- OutputDir = "";
- InputFileName = "";
- OutputFileName = "";
- OutputWidth = 110;
- OutputHeight = 110;
- rate = 0;
- }
- public boolean s_pic() {
- // BufferedImage image;
- // String NewFileName;
- // 建立输出文件对象
- File file = new File(OutputDir + OutputFileName);
- FileOutputStream tempout = null;
- try {
- tempout = new FileOutputStream(file);
- } catch (Exception ex) {
- System.out.println(ex.toString());
- }
- Image img = null;
- Toolkit tk = Toolkit.getDefaultToolkit();
- Applet app = new Applet();
- MediaTracker mt = new MediaTracker(app);
- try {
- img = tk.getImage(InputDir + InputFileName);
- mt.addImage(img, 0);
- mt.waitForID(0);
- } catch (Exception e) {
- e.printStackTrace();
- }
- if (img.getWidth(null) == -1) {
- System.out.println(" can't read,retry!" + "<BR>");
- return false;
- } else {
- int new_w;
- int new_h;
- if (this.proportion == true) { // 判断是否是等比缩放.
- // 为等比缩放计算输出的图片宽度及高度
- double rate1 = ((double) img.getWidth(null))
- / (double) OutputWidth + 0.1;
- double rate2 = ((double) img.getHeight(null))
- / (double) OutputHeight + 0.1;
- double rate = rate1 > rate2 ? rate1 : rate2;
- new_w = (int) (((double) img.getWidth(null)) / rate);
- new_h = (int) (((double) img.getHeight(null)) / rate);
- } else {
- new_w = OutputWidth; // 输出的图片宽度
- new_h = OutputHeight; // 输出的图片高度
- }
- BufferedImage buffImg = new BufferedImage(new_w, new_h,
- BufferedImage.TYPE_INT_RGB);
- Graphics g = buffImg.createGraphics();
- g.setColor(Color.white);
- g.fillRect(0, 0, new_w, new_h);
- g.drawImage(img, 0, 0, new_w, new_h, null);
- g.dispose();
- JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(tempout);
- try {
- encoder.encode(buffImg);
- tempout.close();
- } catch (IOException ex) {
- System.out.println(ex.toString());
- }
- }
- return true;
- }
- public boolean s_pic(String InputDir, String OutputDir,
- String InputFileName, String OutputFileName) {
- // 输入图路径
- this.InputDir = InputDir;
- // 输出图路径
- this.OutputDir = OutputDir;
- // 输入图文件名
- this.InputFileName = InputFileName;
- // 输出图文件名
- this.OutputFileName = OutputFileName;
- return s_pic();
- }
- /**
- * s_pic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
- * @param InputDir
- * @param OutputDir
- * @param InputFileName
- * @param OutputFileName
- * @param width
- * @param height
- * @param gp
- * @return
- */
- public boolean s_pic(String InputDir, String OutputDir,
- String InputFileName, String OutputFileName, int width, int height,
- boolean gp) {
- // 输入图路径
- this.InputDir = InputDir;
- // 输出图路径
- this.OutputDir = OutputDir;
- // 输入图文件名
- this.InputFileName = InputFileName;
- // 输出图文件名
- this.OutputFileName = OutputFileName;
- // 设置图片长宽
- setW_H(width, height);
- // 是否是等比缩放 标记
- this.proportion = gp;
- return s_pic();
- }
- public void setInputDir(String InputDir) {
- this.InputDir = InputDir;
- }
- public void setOutputDir(String OutputDir) {
- this.OutputDir = OutputDir;
- }
- public void setInputFileName(String InputFileName) {
- this.InputFileName = InputFileName;
- }
- public void setOutputFileName(String OutputFileName) {
- this.OutputFileName = OutputFileName;
- }
- public void setOutputWidth(int OutputWidth) {
- this.OutputWidth = OutputWidth;
- }
- public void setOutputHeight(int OutputHeight) {
- this.OutputHeight = OutputHeight;
- }
- public void setW_H(int width, int height) {
- this.OutputWidth = width;
- this.OutputHeight = height;
- }
- }
看看效果吧!
第二种,清晰度还可以接受
[java] view plaincopyprint?
- package com.xiyuan.upload;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Random;
- import javax.imageio.ImageIO;
- import org.apache.struts2.ServletActionContext;
- /**
- *
- * 上传图片 工具类 大图片路径,生成小图片路径, 大图片文件名,生成小图片文名, 生成小图片宽度,生成小图片高度, 是否等比缩放(默认为true))
- *
- * @author Administrator
- *
- */
- public class UploadUtil
- {
- private String imagePath = "/imageFile/" + new SimpleDateFormat("yyyyMMddHH").format(new Date()) + "";// 配置图片路径
- /**
- *
- * @param getUpload
- * 路径
- * @param getUploadContentType
- * 文件类型
- * @param getUploadFileName
- * 原文件名
- * @return
- * @throws IOException
- */
- public void uploadImage1(File getUpload, String getUploadContentType, String getUploadFileName) throws IOException
- {
- String getImagePath = ServletActionContext.getServletContext().getRealPath(imagePath);
- File image = new File(getImagePath);
- if (!image.exists())
- {
- image.mkdir();
- }
- // 得到上传文件的后缀名
- String uploadName = getUploadContentType;
- System.out.println("图片类型 ------------" + uploadName);
- String lastuploadName = uploadName.substring(uploadName.indexOf("/") + 1, uploadName.length());
- System.out.println("得到上传文件的后缀名 ------------" + lastuploadName);
- // 得到文件的新名字
- String fileNewName = generateFileName(getUploadFileName);
- System.out.println("// 得到文件的新名字 ------------" + fileNewName);
- // FileOutputStream fos = new FileOutputStream(getImagePath + "/" +
- // fileNewName);
- //
- // FileInputStream fis = new FileInputStream(getUpload);
- // byte[] buffer = new byte[1024];
- // int len = 0;
- // while ((len = fis.read(buffer)) > 0) {
- // fos.write(buffer, 0, len);
- // }
- // 最后返回图片路径
- imagePath = imagePath + "/" + fileNewName;
- System.out.println(" 回图片路径 " + getUpload);
- System.out.println(" //最后返回图片路径 " + imagePath);
- BufferedImage srcBufferImage = ImageIO.read(getUpload);
- System.out.println(" w " + srcBufferImage.getWidth() + " w " + srcBufferImage.getHeight());
- BufferedImage scaledImage;
- ScaleImage scaleImage = ScaleImage.getInstance();
- int yw = srcBufferImage.getWidth();
- int yh = srcBufferImage.getHeight();
- int w = 110, h = 110;
- // 如果上传图片 宽高 比 压缩的要小 则不压缩
- if (w > yw && h > yh)
- {
- FileOutputStream fos = new FileOutputStream(getImagePath + "/" + fileNewName);
- FileInputStream fis = new FileInputStream(getUpload);
- byte[] buffer = new byte[1024];
- int len = 0;
- while ((len = fis.read(buffer)) > 0)
- {
- fos.write(buffer, 0, len);
- }
- }
- else
- {
- scaledImage = scaleImage.imageZoomOut(srcBufferImage, w, h);
- FileOutputStream out = new FileOutputStream(getImagePath + "/" + fileNewName);
- ImageIO.write(scaledImage, "jpeg", out);
- }
- }
- /**
- * 传入原图名称,,获得一个以时间格式的新名称
- *
- * @param fileName
- * 原图名称
- * @return
- */
- private String generateFileName(String fileName)
- {
- DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
- String formatDate = format.format(new Date());
- int random = new Random().nextInt(10000);
- int position = fileName.lastIndexOf(".");
- String extension = fileName.substring(position);
- return formatDate + random + extension;
- }
- public String getImagepath()
- {
- return imagePath;
- }
- }
ScaleImage
[java] view plaincopyprint?
- package com.xiyuan.upload;
- import java.awt.image.BufferedImage;
- public class ScaleImage {
- private int width;
- private int height;
- private int scaleWidth;
- private double support = (double) 3.0;
- private double PI = (double) 3.14159265358978;
- private double[] contrib;
- private double[] normContrib;
- private double[] tmpContrib;
- private int nDots;
- private int nHalfDots;
- /**
- * Start: Use Lanczos filter to replace the original algorithm for image
- * scaling. Lanczos improves quality of the scaled image modify by :blade
- */
- private static ScaleImage instance = new ScaleImage();
- private ScaleImage(){};
- public static ScaleImage getInstance(){
- return instance;
- }
- public BufferedImage imageZoomOut(BufferedImage srcBufferImage, int w, int h) {
- width = srcBufferImage.getWidth();
- height = srcBufferImage.getHeight();
- scaleWidth = w;
- if (DetermineResultSize(w, h) == 1) {
- return srcBufferImage;
- }
- CalContrib();
- BufferedImage pbOut = HorizontalFiltering(srcBufferImage, w);
- BufferedImage pbFinalOut = VerticalFiltering(pbOut, h);
- return pbFinalOut;
- }
- /**
- * 决定图像尺寸
- */
- private int DetermineResultSize(int w, int h) {
- double scaleH, scaleV;
- scaleH = (double) w / (double) width;
- scaleV = (double) h / (double) height;
- // �?��判断�?��scaleH,scaleV,不做放大操�?
- if (scaleH >= 1.0 && scaleV >= 1.0) {
- return 1;
- }
- return 0;
- } // end of DetermineResultSize()
- private double Lanczos(int i, int inWidth, int outWidth, double Support) {
- double x;
- x = (double) i * (double) outWidth / (double) inWidth;
- return Math.sin(x * PI) / (x * PI) * Math.sin(x * PI / Support)
- / (x * PI / Support);
- } // end of Lanczos()
- //
- // Assumption: same horizontal and vertical scaling factor
- //
- private void CalContrib() {
- nHalfDots = (int) ((double) width * support / (double) scaleWidth);
- nDots = nHalfDots * 2 + 1;
- try {
- contrib = new double[nDots];
- normContrib = new double[nDots];
- tmpContrib = new double[nDots];
- } catch (Exception e) {
- System.out.println("init contrib,normContrib,tmpContrib" + e);
- }
- int center = nHalfDots;
- contrib[center] = 1.0;
- double weight = 0.0;
- int i = 0;
- for (i = 1; i <= center; i++) {
- contrib[center + i] = Lanczos(i, width, scaleWidth, support);
- weight += contrib[center + i];
- }
- for (i = center - 1; i >= 0; i--) {
- contrib[i] = contrib[center * 2 - i];
- }
- weight = weight * 2 + 1.0;
- for (i = 0; i <= center; i++) {
- normContrib[i] = contrib[i] / weight;
- }
- for (i = center + 1; i < nDots; i++) {
- normContrib[i] = normContrib[center * 2 - i];
- }
- } // end of CalContrib()
- // 处理边缘
- private void CalTempContrib(int start, int stop) {
- double weight = 0;
- int i = 0;
- for (i = start; i <= stop; i++) {
- weight += contrib[i];
- }
- for (i = start; i <= stop; i++) {
- tmpContrib[i] = contrib[i] / weight;
- }
- } // end of CalTempContrib()
- private int GetRedValue(int rgbValue) {
- int temp = rgbValue & 0x00ff0000;
- return temp >> 16;
- }
- private int GetGreenValue(int rgbValue) {
- int temp = rgbValue & 0x0000ff00;
- return temp >> 8;
- }
- private int GetBlueValue(int rgbValue) {
- return rgbValue & 0x000000ff;
- }
- private int ComRGB(int redValue, int greenValue, int blueValue) {
- return (redValue << 16) + (greenValue << 8) + blueValue;
- }
- // 行水平滤�?
- private int HorizontalFilter(BufferedImage bufImg, int startX, int stopX,
- int start, int stop, int y, double[] pContrib) {
- double valueRed = 0.0;
- double valueGreen = 0.0;
- double valueBlue = 0.0;
- int valueRGB = 0;
- int i, j;
- for (i = startX, j = start; i <= stopX; i++, j++) {
- valueRGB = bufImg.getRGB(i, y);
- valueRed += GetRedValue(valueRGB) * pContrib[j];
- valueGreen += GetGreenValue(valueRGB) * pContrib[j];
- valueBlue += GetBlueValue(valueRGB) * pContrib[j];
- }
- valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen),
- Clip((int) valueBlue));
- return valueRGB;
- } // end of HorizontalFilter()
- // 图片水平滤波
- private BufferedImage HorizontalFiltering(BufferedImage bufImage, int iOutW) {
- int dwInW = bufImage.getWidth();
- int dwInH = bufImage.getHeight();
- int value = 0;
- BufferedImage pbOut = new BufferedImage(iOutW, dwInH,
- BufferedImage.TYPE_INT_RGB);
- for (int x = 0; x < iOutW; x++) {
- int startX;
- int start;
- int X = (int) (((double) x) * ((double) dwInW) / ((double) iOutW) + 0.5);
- int y = 0;
- startX = X - nHalfDots;
- if (startX < 0) {
- startX = 0;
- start = nHalfDots - X;
- } else {
- start = 0;
- }
- int stop;
- int stopX = X + nHalfDots;
- if (stopX > (dwInW - 1)) {
- stopX = dwInW - 1;
- stop = nHalfDots + (dwInW - 1 - X);
- } else {
- stop = nHalfDots * 2;
- }
- if (start > 0 || stop < nDots - 1) {
- CalTempContrib(start, stop);
- for (y = 0; y < dwInH; y++) {
- value = HorizontalFilter(bufImage, startX, stopX, start,
- stop, y, tmpContrib);
- pbOut.setRGB(x, y, value);
- }
- } else {
- for (y = 0; y < dwInH; y++) {
- value = HorizontalFilter(bufImage, startX, stopX, start,
- stop, y, normContrib);
- pbOut.setRGB(x, y, value);
- }
- }
- }
- return pbOut;
- } // end of HorizontalFiltering()
- private int VerticalFilter(BufferedImage pbInImage, int startY, int stopY,
- int start, int stop, int x, double[] pContrib) {
- double valueRed = 0.0;
- double valueGreen = 0.0;
- double valueBlue = 0.0;
- int valueRGB = 0;
- int i, j;
- for (i = startY, j = start; i <= stopY; i++, j++) {
- valueRGB = pbInImage.getRGB(x, i);
- valueRed += GetRedValue(valueRGB) * pContrib[j];
- valueGreen += GetGreenValue(valueRGB) * pContrib[j];
- valueBlue += GetBlueValue(valueRGB) * pContrib[j];
- // System.out.println(valueRed+"->"+Clip((int)valueRed)+"<-");
- //
- // System.out.println(valueGreen+"->"+Clip((int)valueGreen)+"<-");
- // System.out.println(valueBlue+"->"+Clip((int)valueBlue)+"<-"+"-->");
- }
- valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen),
- Clip((int) valueBlue));
- // System.out.println(valueRGB);
- return valueRGB;
- } // end of VerticalFilter()
- private BufferedImage VerticalFiltering(BufferedImage pbImage, int iOutH) {
- int iW = pbImage.getWidth();
- int iH = pbImage.getHeight();
- int value = 0;
- BufferedImage pbOut = new BufferedImage(iW, iOutH,
- BufferedImage.TYPE_INT_RGB);
- for (int y = 0; y < iOutH; y++) {
- int startY;
- int start;
- int Y = (int) (((double) y) * ((double) iH) / ((double) iOutH) + 0.5);
- startY = Y - nHalfDots;
- if (startY < 0) {
- startY = 0;
- start = nHalfDots - Y;
- } else {
- start = 0;
- }
- int stop;
- int stopY = Y + nHalfDots;
- if (stopY > (int) (iH - 1)) {
- stopY = iH - 1;
- stop = nHalfDots + (iH - 1 - Y);
- } else {
- stop = nHalfDots * 2;
- }
- if (start > 0 || stop < nDots - 1) {
- CalTempContrib(start, stop);
- for (int x = 0; x < iW; x++) {
- value = VerticalFilter(pbImage, startY, stopY, start, stop,
- x, tmpContrib);
- pbOut.setRGB(x, y, value);
- }
- } else {
- for (int x = 0; x < iW; x++) {
- value = VerticalFilter(pbImage, startY, stopY, start, stop,
- x, normContrib);
- pbOut.setRGB(x, y, value);
- }
- }
- }
- return pbOut;
- } // end of VerticalFiltering()
- private int Clip(int x) {
- if (x < 0)
- return 0;
- if (x > 255)
- return 255;
- return x;
- }
- /**
- * End: Use Lanczos filter to replace the original algorithm for image
- * scaling. Lanczos improves quality of the scaled image modify by :blade
- */
- }
看看第二种效果怎样。。
呵呵,,第二种不错吧! 好了,以上是struts2上传图片生成高清缩略图,接下来就是如何利用spring mvc 来完成这个功能了。。
首先spring MVC没有 ServletActionContext.getServletContext().getRealPath(imagePath); 这个获取上下文的方法。你也可以自己写一个,,
但可以用request啊。有现成的何必再自己写呢!呵呵
request.getSession().getServletContext().getRealPath(imagePath); 用这个代替,当然方法逆天必需传入request
第二:
BufferedImage srcBufferImage = ImageIO.read(getUpload); 这个方法 传入getUpload是file 类型,但spring MVC 中MultipartFile 只有这个类型。所以行不通。查了查API,
发现ImageIO.read(getUpload); 可以传入InputStream的。所以只要修改一下multipartFile.getInputStream()就OK。。 最后一点:同样道
理 把 FileInputStream fis = new FileInputStream(getUpload); 修改为 FileInputStream fis = (FileInputStream) multipartFile.getInputStream();好吧!贴上源码: ScaleImage
这个类不变。。只修改一下UploadUtil
[java] view plaincopyprint?
- package com.lanyuan.upload;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Random;
- import javax.imageio.ImageIO;
- import javax.servlet.http.HttpServletRequest;
- import org.springframework.web.multipart.MultipartFile;
- /**
- *
- * 上传图片 工具类 大图片路径,生成小图片路径, 大图片文件名,生成小图片文名, 生成小图片宽度,生成小图片高度, 是否等比缩放(默认为true))
- *
- * @author Administrator
- *
- */
- public class UploadUtil
- {
- private String imagePath = "/imageFile/" + new SimpleDateFormat("yyyyMMddHH").format(new Date()) + "";// 配置图片路径
- /**
- *
- * @param getUpload
- * 路径
- * @param getUploadContentType
- * 文件类型
- * @param getUploadFileName
- * 原文件名
- * @return
- * @throws IOException
- */
- public void uploadImage1(HttpServletRequest request,MultipartFile file, String getUploadContentType, String getUploadFileName) throws IOException
- {
- String getImagePath = request.getSession().getServletContext().getRealPath(imagePath);
- File image = new File(getImagePath);
- if (!image.exists())
- {
- image.mkdir();
- }
- // 得到上传文件的后缀名
- String uploadName = getUploadContentType;
- System.out.println("图片类型 ------------" + uploadName);
- String lastuploadName = uploadName.substring(uploadName.indexOf("/") + 1, uploadName.length());
- System.out.println("得到上传文件的后缀名 ------------" + lastuploadName);
- // 得到文件的新名字
- String fileNewName = generateFileName(getUploadFileName);
- System.out.println("// 得到文件的新名字 ------------" + fileNewName);
- // FileOutputStream fos = new FileOutputStream(getImagePath + "/" +
- // fileNewName);
- //
- // FileInputStream fis = new FileInputStream(getUpload);
- // byte[] buffer = new byte[1024];
- // int len = 0;
- // while ((len = fis.read(buffer)) > 0) {
- // fos.write(buffer, 0, len);
- // }
- // 最后返回图片路径
- imagePath = imagePath + "/" + fileNewName;
- System.out.println(" 回图片路径 " + file.getInputStream());
- System.out.println(" //最后返回图片路径 " + imagePath);
- BufferedImage srcBufferImage = ImageIO.read(file.getInputStream());
- System.out.println(" w " + srcBufferImage.getWidth() + " w " + srcBufferImage.getHeight());
- BufferedImage scaledImage;
- ScaleImage scaleImage = ScaleImage.getInstance();
- int yw = srcBufferImage.getWidth();
- int yh = srcBufferImage.getHeight();
- int w = 400, h = 300;
- // 如果上传图片 宽高 比 压缩的要小 则不压缩
- if (w > yw && h > yh)
- {
- FileOutputStream fos = new FileOutputStream(getImagePath + "/" + fileNewName);
- FileInputStream fis = (FileInputStream) file.getInputStream();
- byte[] buffer = new byte[1024];
- int len = 0;
- while ((len = fis.read(buffer)) > 0)
- {
- fos.write(buffer, 0, len);
- }
- }
- else
- {
- scaledImage = scaleImage.imageZoomOut(srcBufferImage, w, h);
- FileOutputStream out = new FileOutputStream(getImagePath + "/" + fileNewName);
- ImageIO.write(scaledImage, "jpeg", out);
- }
- }
- /**
- * 传入原图名称,,获得一个以时间格式的新名称
- *
- * @param fileName
- * 原图名称
- * @return
- */
- private String generateFileName(String fileName)
- {
- DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
- String formatDate = format.format(new Date());
- int random = new Random().nextInt(10000);
- int position = fileName.lastIndexOf(".");
- String extension = fileName.substring(position);
- return formatDate + random + extension;
- }
- public String getImagepath()
- {
- return imagePath;
- }
- }
更多学习资料请访问 https://www.itkc8.com
最后如何调用:请看:很简单
[java] view plaincopyprint?
- @RequestMapping ("upload")
- public String upload(Model model,HttpServletRequest request)
- {
- //转型为MultipartHttpRequest(重点的所在)
- MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
- // 获得第1张图片(根据前台的name名称得到上传的文件)
- MultipartFile imgFile1 = multipartRequest.getFile("imgFile");
- UploadUtil uploadutil = new UploadUtil();
- String fileName = imgFile1.getOriginalFilename();
- try {
- uploadutil.uploadImage1(request, imgFile1, imgFile1.getContentType(), fileName);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return "redirect:query";
- }