前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >猿蜕变系列7——也说说springMVC上传姿势

猿蜕变系列7——也说说springMVC上传姿势

作者头像
山旮旯的胖子
发布2020-07-28 16:57:28
8960
发布2020-07-28 16:57:28
举报
文章被收录于专栏:猿人工厂猿人工厂

看过之前的蜕变系列文章,相信你对springMVC有了一定的认识。对springMVC的异常处理,也有了一定的认识。今天我们来开启新讨论,讲一讲web开发中会经常遇到的一个功能,文件上传。

文件上传这种小事情,我们自然不用担心啦。SpringMVC提供了强有力的支持,不会让你退化到使用request的inputStram的老路上去哒。一般来说,使用commons组件就轻松搞定啦。

我们在讲文件上传文件的功能之前,先做一点准备工作啦,我们先在webapp目录下创建一个名为upload的文件夹用于存放上传的文件。

然后,再编写一个文件上传的表单页面upload.jsp文件,增加一个表单即可。

代码语言:javascript
复制
<%@ page language="java" contentType="text/html;charset=utf-8"
    pageEncoding="utf-8"isELIgnored="false"%>
<!DOCTYPE html >
<html>
<head>
<title>Spring MVC 文件上传样例</title>
</head>
<body>
   <form action="upload.do" enctype="multipart/form-data"method=post id="picForm">
    <lable>请选择需要上传的文件:</lable>
      <input type="file"name="pic" id=""pic""/><br />
    
      <input type="submit"value="提交" id="submit"/><br />
   </form>
</body>

注意:上传文件的表单需要在from标签中加入属性enctype="multipart/form-data",没有这个等待你的必然是,一顿操作猛如虎,抬头一看原地杵。

代码语言:javascript
复制
</html>显示上传文件的页面showUpload.jsp
<%@ page language="java" contentType="text/html;charset=utf-8"
    pageEncoding="utf-8"isELIgnored="false"%>
<!DOCTYPE html >
<html>
<head>
<title>Spring MVC 文件上传样例</title>
 
</head>
<body>
   <img src="${path}"/>
</body>
</html>

编写Controller代码

代码语言:javascript
复制
package com.pz.web.study.springmvc.controller;
 
import java.io.File;
 
import javax.servlet.http.HttpServletRequest;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
 
 
@Controller
public class UploadFileControllerDemo {
      
       @RequestMapping("/upload.do")
       public String upload(MultipartFilepic,HttpServletRequest req,Model model) throws Exception {
             
               if(!pic.isEmpty()) {
                   //获取服务器上传的文件路径
                   String path =req.getServletContext().getRealPath("/upload");
                   //获取文件名称
                   String filename =pic.getOriginalFilename();
                   //限制文件上传的类型
                   if ("image/png".equals(pic.getContentType())||"image/jpeg".equals(pic.getContentType())||"image/jpg".equals(pic.getContentType())) {
                       File file = new File(path, filename);
                       //完成文件上传
                       pic.transferTo(file);
                       model.addAttribute("path", "/upload"+"/"+filename);
                       return"showUpload";
                   }
               }
              return"../upload";
       }
 
      
}

Spring MVC提供了MultipartFile类型来接收文件类型的参数,MultipartFile是一个接口,提供了一些操作文件的方法:

getOriginalFilename() 获取上传文件的文件名

isEmpty() 用于判断是否有文件上传,如果有文件上传返回true

getContentType() 获取上传文件类型 transferTo(File file) 将文件上传写入磁盘。

getName() 获取表单中input标签里的name属性值。

getBytes() 以byte数组的形式返回上传文件。

getInputStream() 返回上传文件的InputStram对象。

req.getServletContext().getRealPath("/upload")用于获取上传文件被存放的目录,其中getRealPath中的路径相对于应用的webapp目录算起的,不要搞错了噢。

修改pom.xml引入commons相关依赖:

代码语言:javascript
复制
<dependency>
              <groupId>commons-io</groupId>
              <artifactId>commons-io</artifactId>
              <version>2.6</version>
       </dependency>
 
 
       <dependency>
              <artifactId>commons-fileupload</artifactId>
              <groupId>commons-fileupload</groupId>
              <version>1.3.3</version>
       </dependency>
  </dependencies>

修改spring-servlet.xml增加配置

代码语言:javascript
复制
<bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--设置字符编码防止文件名乱码-->
    <property name="defaultEncoding"value="utf-8"/>
    <!--设置上传文件的总大小,单位是字节b-->
    <property name="maxUploadSize"value="2048576"/>
    <!--设置内存缓冲区的大小,当超过该值的时候会写入到临时目录-->
    <property name="maxInMemorySize"value="2048576"/>
    <!--设置临时目录-->
    <property name="uploadTempDir"value="temp"/>
    <!--默认是false,如果设置为true的话,不会将文件路径去除-->
    <property name="preserveFilename"value="false"/>
    <!--是否使用懒加载,默认是false-->
    <property name="resolveLazily"value="true"/>
</bean>

启动应用,访问http://127.0.0.1/upload.jsp。蘑菇头,赶紧选择一张好看的图片,上传吧。

当上传的文件文件超出配置时指定的大小,应用程序会抛出异常——MaxUploadSizeExceededException。我们之前已经学习过SpringMVC的相关异常处理了,这里就不再重复讲了。

上传多个文件与单个文件最主要的区别是在于,Controller中接收文件的参数类型为MultipartFile的数组,即MultipartFile[] 并且需要加上annotation——@RequestParam。上传多个文件的页面input标记要设置相同的name属性值。我们看下面这个例子:

编写用于上传的jsp页面 uploadMultiFile.jsp

代码语言:javascript
复制
<%@ page language="java" contentType="text/html;charset=utf-8"
    pageEncoding="utf-8"isELIgnored="false"%>
<!DOCTYPE html >
<html>
<head>
<title>Spring MVC 文件上传样例</title>
 
</head>
<body>
   <form action="uploadMultiFile.do"enctype="multipart/form-data" method=post id="picForm">
    <lable>请选择需要上传的文件:</lable>
      <input type="file"name="pics" id=""pic""/><br />
       <input type="file"name="pics" id=""pic""/><br />
    
      <input type="submit"value="提交" id="submit"/><br />
   </form>
</body>
</html>

编写Controller代码,在UploadFileControllerDemo中新增方法

代码语言:javascript
复制
   @RequestMapping("/uploadMultiFile.do")
       public String uploadMultiFile(@RequestParam("pics") MultipartFile[] pics, HttpServletRequest req,
                     Model model) throws Exception {
 
              if (null != pics || pics.length < 2) {
                     List<String> paths= new LinkedList<String>();
                     for (MultipartFile pic : pics) {
                            // 获取服务器上传的文件路径
                            String path =req.getServletContext().getRealPath("/upload");
                            // 获取文件名称
                            String filename =pic.getOriginalFilename();
                            // 限制文件上传的类型
                            if ("image/png".equals(pic.getContentType())
                                          || "image/jpeg".equals(pic.getContentType())
                                          || "image/jpg".equals(pic.getContentType())) {
                                   File file = new File(path, filename);
                                   // 完成文件上传
                                   pic.transferTo(file);
                                   paths.add("/upload" + "/" +filename);
                                  
 
                            }
                    
                     }
                     model.addAttribute("paths", paths);
                     return"showUploadMultiFile";
                    
              }
              return"../uploadMultiFile";
       }

再次强调一下,@RequestParam("pics") MultipartFile[] 注意参数类型 和annotation的值,必须和页面input标记的name属性值匹配!

启动应用,访问http://127.0.0.1/uploadMultiFile.jsp,上传多个文件试试吧。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 猿人工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档