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

实现图片上传
  用户必须能够上传图片,因此需要文件上传的功能。比较常见的文件上传组件有Commons FileUpload,这里我们选择Commons FileUpload。

首先是页面的form表单设置,记住要配method和enctype属性哦!!

<form action="upload.do" method="post" 
          enctype="multipart/form-data">
          <input name="file" type="file">
          <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;
        // 获得文件:
        MultipartFile multipartFile = multipartRequest.getFile("file");
        // 获得文件名: 
        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);        
    }
}
时间: 2024-12-03 03:55:31

spring 文件上传 + 图片缩放 + 图片截取(头像功能)的相关文章

ajax+spring文件上传

1.js代码 $(function(){ $('#upfileID').change(function(){ $.ajaxFileUpload({ url: '/upload/image', type: 'post', secureuri: false, //一般设置为false fileElementId: 'upfileID', // 上传文件的id属性名 dataType: 'text', //返回值类型,一般设置为json.application/json success: functi

input file实现多选,限制文件上传类型,图片上传前预览功能

限制上传类型 & 多选:① accept 属性只能与 <input type="file" /> 配合使用.它规定能够通过文件上传进行提交的文件类型. ② multiple 属性规定输入字段可选择多个值. 示例: <!-- image/* 所有图片 image/png png图片 image/jpg jpg图片 image/gif gir动图 application/msword Word文档(.doc) application/vnd.openxmlform

采用HttpClient3.x上传文件 spring 文件上传

最近,项目需要调用第三方的系统上传图片,在长传图片的同时,还需要携带其他的请求参数:整体的流程是:网页---->spring mvc--->业务处理---->调用第三方系统上传图片: 在此期间遇到的问题是:在调用第三方系统上传图片时,除了图片文件参数外,其他参数期望通过request.getParameter()方法能够访问到,采用了很多方式,都不行,最终通过不断的尝试,测试成功,特贡献出来供需要的人员参考! 采用spring 的MultipartFile进行文件上传,代码如下     

Spring文件上传

因为文件上传这样的工作一般来说是开发人员自定的,所以Spring默认是不处理multipart请求的.但Spring为multipart做了些通用的支持性工作. Form元素 Form元素的enctype必须是multipart/form-data. Configuration MultipartResolver 处理multipart请求需要一个MultipartResolver: <bean id="multipartResolver" class="org.spr

(转)Spring文件上传,包括一次选中多个文件

背景: http://www.cnblogs.com/lixuwu/p/8495275.html已经实现了单文件的上传和下载,多文件的上传是另一种情景,这里记录下来 实现过程 先说前台. 运行以后就是这样子的. 一个非常简单的表单页面, 两个文件上传按钮, 一个提交 其中单个文件上传, 即只能选择一个文件, 无法同时选择多个 相对的, 多个文件就是可以同时选择多个文件了 文件选择以后就是这个样子 前台设置 代码如下: 一个form, 文件上传就是一个<input>输入, 属性type=&quo

Spring文件上传Demo

package com.smbea.controller; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.FileUtil

java spring 文件上传监听 控制条显示

1.        接管CommonsMultipartResolver,重写针对文件上传的请求. package com.sinosoft.amoeba.fileupload; import com.sinosoft.amoeba.fileupload.listener.FileUploadProgressListener;import org.apache.commons.fileupload.*;import org.apache.commons.fileupload.servlet.Se

Spring MVC 文件上传与下载2及分页功能

Service 方法public List<Map<String,Object>> handleMultipartRequest(String fileGuid, MultipartRequest request, HttpServletRequest httpServletRequest) throws Exception {List<Map<String, Object>> uploadFileList=new ArrayList<Map<S

MVC&amp;WebForm对照学习:文件上传(以图片为例)

在web应用中,文件上传是个很普遍的功能,那么今天就来小结一下asp.net中文件上传的方式.首先我们快速来回忆一下WebForm中的文件上传的方法. Part 1 WebForm中的文件上传  FileUpload服务器控件 aspx: <div> <asp:Image ImageUrl="~/uploads/1.jpg" ID="img2" runat="server" Width="150px" Hei