您的位置:首页 > 编程语言 > Java开发

spring 多文件上传 + 图片缩放 + 图片截取(头像功能)

2014-10-28 17:48 435 查看
实现图片上传
  用户必须能够上传图片,因此需要文件上传的功能。比较常见的文件上传组件有Commons FileUpload,这里我们选择Commons FileUpload。
首先是页面的form表单设置,记住要配method和enctype属性哦!!

<form action="upload.do" method="post"
enctype="multipart/form-data">
<input name="file" type="file" multiple>
<input type="submit" value="submit">
</form>
  由于Post一个包含文件上传的Form会以multipart/form-data请求发送给服务器,必须明确告诉DispatcherServlet如何处理MultipartRequest。首先在dispatcher-servlet.xml中声明一个MultipartResolver:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为1MB -->
<property name="maxUploadSize">
<value>1048576</value>
</property>
</bean>
这样一旦某个Request是一个MultipartRequest,它就会首先被MultipartResolver处理,然后再转发相应的Controller。

在FileAction中,将HttpServletRequest转型为MultipartHttpServletRequest,就能非常方便地得到文件名和文件内容。
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String upload(HttpServletRequest request,HttpServletResponse response) throws IOException, IllegalStateException {
// 转型为MultipartHttpRequest:
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
// 获得文件:
List<MultipartFile> multipartFileList = multipartRequest.getFiles("file");
for (MultipartFile multipartFile:multipartFileList){
// 获得文件名:
String filename =multipartFile.getOriginalFilename();
String tmps[] = filename.split("\\.");// "."在正则表达式中有特殊含义  所以要进行转义
/**
* {1} 获得输入流 在写入文件  (  此处 实现了图片的缩放功能  )
**/
InputStream input = multipartFile.getInputStream();
//        createPreviewImage(input,"small-"+tmps[0]+".jpg");
createPreviewImageofCut(input,"smallcut-"+tmps[0]+".jpg");
/**
* {2}或者:
**/
File source = new File("f://"+"normal-"+tmps[0]+".jpg");  //正常大小图片
multipartFile.transferTo(source);

}
return "fileupload";
}
剩余的图片缩放和图片截取都在下面的代码中,比较简单不做过多解释

//创建缩略图
public void createPreviewImage(InputStream input,String filename) throws IOException {
File fo = new File("f://"+filename); // 目标图片
BufferedImage bis = ImageIO.read(input);  //原始图片
int w = bis.getWidth();     //图片原始大小
int h = bis.getHeight();
int nw ;                        //图片缩放后的大小
int nh ;
//缩略图的标准 为  120*120(等比例缩放)
if ( (double)w / h < 1 ){
nh = 120;
nw = nh*w/h;
}else {
nw = 120;
nh = nw*h/w;
}

BufferedImage _image = new BufferedImage(nw, nh,BufferedImage.TYPE_INT_RGB);
_image.getGraphics().drawImage(bis, 0, 0, nw, nh, null); //绘制缩小后的图
FileOutputStream newimageout = new FileOutputStream(fo); //输出到文件流
/*
* JPEGImageEncoder 将图像缓冲数据编码为 JPEG 数据流。该接口的用户应在 Raster
* 或 BufferedImage 中提供图像数据,在 JPEGEncodeParams 对象中设置必要的参数,
* 并成功地打开 OutputStream(编码 JPEG 流的目的流)。JPEGImageEncoder 接口可
* 将图像数据编码为互换的缩略 JPEG 数据流,该数据流将写入提供给编码器的 OutputStream 中。
注意:com.sun.image.codec.jpeg 包中的类并不属于核心 Java API。它们属于 Sun 发布的
JDK 和 JRE 产品的组成部分。虽然其它获得许可方可能选择发布这些类,但开发人员不能寄
希望于从非 Sun 实现的软件中得到它们。我们期望相同的功能最终可以在核心 API 或标准扩
展中得到。
*/
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimageout);
encoder.encode(_image); //近JPEG编码
newimageout.close();
}

//创建截取图
public void createPreviewImageofCut(InputStream input,String filename) throws IOException {
File fo = new File("f://"+filename); // 目标图片
BufferedImage bis = ImageIO.read(input);  //原始图片
int w = bis.getWidth();     //图片原始大小
int h = bis.getHeight();

//四个参数分别为图像起点坐标和宽高,即CropImageFilter(int x,int y,int width,int height),详细情况请参考API
ImageFilter cropFilter =new CropImageFilter(0,0,200,200);
//获得截图图片
Image croppedImage = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(bis.getSource(),cropFilter));
//Image 转为  BufferedImage
BufferedImage bufImg = new BufferedImage(croppedImage.getWidth(null), croppedImage.getHeight(null),BufferedImage.TYPE_INT_RGB);
bufImg .createGraphics().drawImage(croppedImage, 0, 0, null);
//输出为图片文件
ImageIO.write(bufImg, "jpeg", fo);
}
}


本文出自 “流星雨的IT路程” 博客,请务必保留此出处http://lxy2020.blog.51cto.com/2528961/1568956
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐