Spring MVC 图片上传及预览

整理了一下Spring MVC框架的上传图片及其预览的方法;上传位置可以是项目中指定文件夹、本地指定文件夹或者七牛云空间(见:Spring MVC 上传图片至七牛云图床),查看博客原文:http://www.dustyblog.cn/110.html

一、Spring MVC为文件上传提供了直接的支持,需要依赖Apache Commons FileUpload的组件:

  1. <dependency>
  2.   <groupId>commons-io</groupId>
  3.   <artifactId>commons-io</artifactId>
  4.   <version>2.4</version>
  5. </dependency>

 二、SpringMVC中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作,所以需要配置在springmvc-mvc.xml进行配置:

 
  1. <!-- 需要文件上传功能时,启用以下配置 -->
  2. <bean id="multipartResolver"
  3. class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  4.     <!--设置上传最大尺寸为50MB-->
  5.     <property name="maxUploadSizePerFile" value="52428800"/>
  6.     <!--请求的编码格式-->
  7.     <property name="defaultEncoding" value="UTF-8"/>
  8. </bean>

三、前端异步请求,需要ajaxfileupload.js的插件(点此下载)

HTML:

 
  1. <img id="avatarImg" src="/default-share.jpg" alt="Spring MVC 文件上传" />
  2. <input type="file" id="imgurl" name="file"onchange="uploadPic(this.id);"
  3. accept="image/gif, image/jpeg, image/png">
  4. <input type="button" value="更换头像" onclick="getElementById('imgurl').click()">

 Ajax请求(记得导入jquery和ajaxfileupload.js插件)

 
  1. function uploadPic(imgId) {
  2.     $.ajaxFileUpload(
  3.         {
  4.             url: '/uploadImg', //用于文件上传的服务器端请求地址
  5.             secureuri: false//是否需要安全协议,一般设置为false
  6.             fileElementId: imgId, //文件上传域的ID
  7.             dataType: 'json', //返回值类型 一般设置为json
  8.             success: function (data){  //服务器成功响应处理函数
  9.                 if(data == "OUTOFSIZE"){
  10.                     swal("图片大小超出3M限制!");
  11.                 }else if(data == "ERROR"){
  12.                     swal("图片错误!请重新上传!");
  13.                 }else if(data=="EMPTY"){
  14.                     swal("未选择图片")
  15.                 }else {
  16.                     // 我这里是上传到项目中的,所以这里获取一下
  17.                     var src="http://localhost:8080/resources/upload/"+data;
  18.                     $("#avatarImg").attr("src",src);
  19.                 }
  20.             },
  21.             error: function () {
  22.                 alert("上传失败");
  23.             },
  24.         }
  25.     );
  26. }

 四、控制层处理,这里需要注意,这里介绍了两种上传位置:上传到项目中/本地文件夹,详见26-30行代码及其备注,如需上传到图床,请参考:

Spring MVC 上传图片至七牛云图床

  1. //  上传图片的大小
  2.     private static Double Mb = 1024.0 * 1024.0;
  3.     private static Double maxSize = 3.0;
  4. //  图片重复名称计数
  5.     private static Integer index = 1;
  6.  
  7.     //上传图片到项目中/本地
  8.     @RequestMapping(value = "/uploadImg",method = RequestMethod.POST)
  9.     @ResponseBody
  10.     public String uploadImg(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws Exception {
  11.         //如果文件不为空,写入上传路径
  12.         if(!file.isEmpty()) {
  13.             if(!checkSize(file)){
  14.                 return "OUTOFSIZE";//超出限制大小
  15.             }
  16.             String widthAndHeight = this.getWidthAndHeight(file);
  17.             if(widthAndHeight.equals("ERROR")){
  18.                 return "ERROR";
  19.             }
  20.             //文件的完整名称,如image.jpg
  21.             String filename = file.getOriginalFilename();
  22.             //文件名,如image
  23.             String name = filename.substring(0,filename.indexOf("."));
  24.             //文件后缀,如.jpg
  25.             String suffix = filename.substring(filename.lastIndexOf("."));
  26.             //上传文件路径:
  27.             // 1、上传到项目中
  28.             String path = request.getServletContext().getRealPath("/resources/upload");
  29.             // 2、上传到本地
  30. //            String path = "E:\\upload";
  31.             File filepath = new File(path,filename);
  32.             //若文件存在重命名,更改文件名如:image(1).jpg 后上传
  33.             String newFilename = filename;
  34.             while(filepath.exists()) {
  35.                 newFilename = name+"("+index+")"+suffix;
  36.                 String parentPath = filepath.getParent();
  37.                 filepath = new File(parentPath+File.separator+newFilename);
  38.                 filename = newFilename;
  39.                 index++;
  40.             }
  41.             //判断路径是否存在,如果不存在就创建一个
  42.             if (!filepath.getParentFile().exists()) {
  43.                 filepath.getParentFile().mkdirs();
  44.             }
  45.             //将上传文件保存到一个目标文件当中
  46.             file.transferTo(new File(path + File.separator + filename));
  47.             return filename;
  48.         }
  49.             return "EMPTY";
  50.     }
  51.     /**
  52.      * 校验大小,上传图片不能大于3M
  53.      * @param file
  54.      * @return
  55.      */
  56.     public static boolean checkSize(MultipartFile file){
  57.         //校验大小
  58.         double ratio = file.getSize() / Mb;
  59.         if(ratio > maxSize){
  60.             return false;
  61.         }else{
  62.             return true;
  63.         }
  64.     }

 效果展示:

Spring MVC 图片上传

MultipartFile提供了获取上传文件内容、文件名等方法。通过transferTo()方法还可以将文件存储到硬件中,MultipartFile对象中的常用方法如下:

  1. byte[]  getBytes():获取文件数据  
  2. String  getContentType[]:获取文件MIME类型,如image/jpeg等;  
  3. InputStream  getInputStream():获取文件流;  
  4. String  getName():获取表单中文件组件的名字;  
  5. String  getOriginalFilename():获取上传文件的原名;  
  6. Long  getSize():获取文件的字节大小,单位为byte;  
  7. boolean  isEmpty():是否有上传文件;  
  8. void  transferTo(File dest):将上传文件保存到一个目录文件中。  

猜你喜欢

转载自blog.csdn.net/qq_41690817/article/details/80389952