Spring MVC(9):文件上传(单文件,多文件) & 下载

文件上传


Spring MVC 对于文件上传提供了 MultipartResolver 解析器支持,Spring 使用 Jakarta Commons FileUpload 实现了一个 MultipartResovler 的实现类:CommonsMultipartResolver;

在 Spring MVC 中使用文件上传模块,需要导入以下的依赖库:
commons-fileupload:commons-fileupload
commons-io:commons-io

同时需要在 spring-mvc 上下文配置文件中装配一个 MultipartResolver,如下:
 
<!--配置文件上传解析器-->
<bean id="multipartResolver"      
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
          p:defaultEncoding="UTF-8"
          p:maxUploadSize="#{1024*1024*5}"
/>
其中常用参数如下: 
  • defaultEncoding:默认编码;
  • maxUploadSize:一次表单请求中单个上传文件最大容量;
  • uploadTempDir:上传临时文件存放路径,上传结束后自动删除;
  • maxInMemorySize:一次请求中所有上传文件的总最大容量;


单文件上传

在文件上传的提交表单中,注意要将  enctype 属性设置为 multipart/form-data,同时设置 method 为 post;
以下是提交表单视图:uploadPage.jsp
 
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>文件上传下载页面</title>
</head>
<body>
<h1>单文件上传</h1>
<form action="<c:url value="/upload"/>" method="post" enctype="multipart/form-data">
    文件 <input type="file" name="uploadFile"/><br/>
    <input type="submit" value="上传"/>
</form>
<br/>
    
</body>
</html>
以下为控制器:UploadController.jsp
 
package site.assad.web;
@Controller
public class UploadController {
    @RequestMapping("/uploadPage")
    public String gotoUploadPage(){
        return "/uploadPage";
    }
    //单文件上传
    @RequestMapping(value="/upload",method=RequestMethod.POST)
    public String uploadSingle(@RequestParam(value="uploadFile") MultipartFile file, Model model,HttpSession session) throws IOException {
        if(!file.isEmpty()){
            model.addAttribute("msg","Upload File Success");
            model.addAttribute("name","file name:"+file.getOriginalFilename());  //获取上传文件名
            model.addAttribute("size","file size:"+file.getSize()+"bytes");   //获取上传文件大小
            String uploadpath = session.getServletContext().getRealPath("./upload/");
            // String uploadpath = "/C:/Al-assad/workplace/workplace-IDEA/testSpring_mvc_upload/src/main/webapp/upload";  //固定的文件路径,方便idea的内嵌tomcat调试
            file.transferTo(new File(uploadpath,file.getOriginalFilename()));
        }else{
            model.addAttribute("msg","Upload File fail");
        }
        return "/result";
    }
}
以下为结果视图:result.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html lang="en">
<head>
    <title>Success Page</title>
</head>
<body>
<h1><c:out value="${msg}" /></h1>
<p>文件信息</p>
    <c:if test="${!name.isEmpty()}">
        <c:out value="${name}" />
    </c:if>
    <br/>
    <c:if test="${!size.isEmpty()}">
        <c:out value="${size}" />
    </c:if>
</body>
</html>
在控制器中,可以通过文件上传参数对象,并指定为 MultipartFile 来控制上传文件的行为,Spring 提供了以下一系列方法:
byte[] getBytes()获取文件字节流
String getContentType()获取文件 MIME 类型,如“image/pjpeg”,“text/plain”
InputStream getInputStream()获取文件输入流
String getName()获取表单中文件组件的 name 字段值
String getOriginalName()获取上传文件的文件名(包含文件后缀)
long getSize()获取上传文件的字节大小(单位 byte)
boolean isEmpty()检查是否有上传的文件
void transferTo(File dest)将该上传文件保存到一个目标文件中


多文件上传

多文件上传的步骤类似于的单文件上传;
表单提交视图部分如下:
<h1>多文件上传</h1>
<form action="<c:url value="/uploadMultiply"/>" method="post" enctype="multipart/form-data">
    文件 <input type="file" name="files"/><br/>
    文件 <input type="file" name="files"/><br/>
    文件 <input type="file" name="files"/><br/>
    <input type="submit" value="上传"/>
</form>
<br/>
控制器处理器代码如下:
    //多文件上传
   @RequestMapping(value="/uploadMultiply",method=RequestMethod.POST)
    public String uploadMultiply(@RequestParam MultipartFile[] files,Model model,HttpSession session) throws IOException {
        List<FileCommand> fileList = new ArrayList<>();
       String uploadpath = session.getServletContext().getRealPath("./upload/");
//       String uploadpath = "/C:/Al-assad/workplace/workplace-IDEA/testSpring_mvc_upload/src/main/webapp/upload";  //固定系统路径,方便idea的内嵌tomcat调试
        
        for(MultipartFile file : files){
            fileList.add(new FileCommand(file.getOriginalFilename(),file.getSize()+"bytes"));
            file.transferTo(new File(uploadpath,file.getOriginalFilename()));
        }
        
        model.addAttribute("msg","Upload File Result");
        model.addAttribute("resultList",fileList);
        return "/result";
   }
结果视图如下:
<%--打印多文件上传信息--%>
<c:if test="${resultList != null}">
    <c:forEach items="${resultList}" var="file">
        file name: <c:out value="${file.fileName}"/><br/>
        file size: <c:out value="${file.fileSize}"/><br/>
        <br/>
    </c:forEach>
</c:if>




文件下载

一个示例的文件下载如下:
文件下载入口视图:
<h1>文件下载</h1>
<a href="<c:url value="/download" />">下载文件</a>
控制器处理器部分:
 
   //文件下载
   @RequestMapping(value="/download")
    public ResponseEntity<byte[]> download() throws IOException {
        //待下载的文件对象
       String downloadPath = "/C:/Al-assad/workplace/workplace-IDEA/testSpring_mvc_upload/src/main/webapp/upload/downloadtest.jpg";
        File file = new File(downloadPath);
        //创建填充响应头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentDispositionFormData("attachement",new String("你好啊少年.jpg".getBytes("UTF-8"),"iso-8859-1"));
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值