SpringMVC中的文件上传和下载
创始人
2025-05-30 05:39:28

SpringMVC中的文件上传和下载

1.准备工作

文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver。

前端表单要求:为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器;

对表单中的 enctype 属性做个详细的说明:

  • application/x-www=form-urlencoded:默认方式,只处理表单域中的 value 属性值,采用这种编码方式的表单会将表单域中的值处理成 URL 编码方式。
  • multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数中,不会对字符编码。
  • text/plain:除了把空格转换为 “+” 号外,其他字符都不做编码处理,这种方式适用直接通过表单发送邮件。

一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP响应。在2003年,Apache Software Foundation发布了开源的Commons FileUpload组件,其很快成为Servlet/JSP程序员上传文件的最佳选择。

  • Servlet3.0规范已经提供方法来处理文件上传,但这种上传需要在Servlet中完成。
  • 而Spring MVC则提供了更简单的封装。
  • Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。
  • Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:
  • CommonsMultipartResolver。因此,SpringMVC的文件上传还需要依赖Apache Commons FileUpload的组件。

2.文件上传

  • 导入文件上传的jar包,commons-fileupload

commons-fileuploadcommons-fileupload1.3.3

  • web.xml

springmvcorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:applicationContext.xml1springmvc/encodingorg.springframework.web.filter.CharacterEncodingFilterencodingutf-8encoding/*

  • applicationContext.xml





  • 其中的bean配置

CommonsMultipartFile 的 常用方法:

  • String getOriginalFilename():获取上传文件的原名
  • InputStream getInputStream():获取文件流
  • void transferTo(File dest):将上传文件保存到一个目录文件中

编写前端页面

<%--Created by IntelliJ IDEA.User: 19401Date: 2023/3/11Time: 10:25To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
首页
  • 编写Controller
package com.sangyu.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.*;/*** @author sangYu* @date 2023/3/11*/
@Controller
public class FileController {@RequestMapping("/upload")public String fileUpLoad(@RequestParam("file")CommonsMultipartFile file, HttpServletRequest request) throws IOException {//获取文件名String originalFilename = file.getOriginalFilename();//如果文件名为空,直接返回首页if ("".equals(originalFilename)){return "redirect:/index.jsp";}System.out.println("上传文件名"+originalFilename);//上传路径保存设置String realPath = request.getServletContext().getRealPath("/upload");//如果路径不存在,创建一个File file1 = new File(realPath);if (!file1.exists()){file1.mkdir();}System.out.println("上传文件保存地址"+realPath);//文件输入流InputStream inputStream = file.getInputStream();OutputStream os = new FileOutputStream(new File(realPath, originalFilename));//读取写出int len=0;byte[] buffer = new byte[1024];while ((len=inputStream.read(buffer))!=-1){os.write(buffer,0,len);os.flush();}os.close();inputStream.close();return "redirect:/index.jsp";}
}

运行Tomcat,上传文件,查找发现目录下确实有我们传进去的文件

使用file.Transto来保存上传的文件

1.编写controller

package com.sangyu.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;/*** @author sangYu* @date 2023/3/11*/
@Controller
public class FileController2 {@RequestMapping("/upload2")public String fileUpload2(HttpServletRequest request,@RequestParam("file") CommonsMultipartFile file) throws IOException {//上传路径保存设置String path = request.getServletContext().getRealPath("/upload");File realPath = new File(path);if (!realPath.exists()){realPath.mkdir();}//上传文件地址System.out.println("上传文件保存地址:"+realPath);//通过CommonsMultipartFile的方法直接写文件(注意这个时候)file.transferTo(new File(realPath +"/"+ file.getOriginalFilename()));return "redirect:/index.jsp";}
}

2.前端表单提交地址修改

3.访问提交测试,OK!

3.文件下载

文件下载步骤:

1、设置 response 响应头

2、读取文件 – InputStream

3、写出文件 – OutputStream

4、执行操作

5、关闭流 (先开后关)

controller

@RequestMapping("/downLoad")public String downloads(HttpServletResponse response , HttpServletRequest request) throws Exception{//要下载的图片地址String  path = request.getServletContext().getRealPath("/upload");String  fileName = "基础语法.jpg";//1、设置response 响应头response.reset(); //设置页面不缓存,清空bufferresponse.setCharacterEncoding("UTF-8"); //字符编码response.setContentType("multipart/form-data"); //二进制传输数据//设置响应头response.setHeader("Content-Disposition","attachment;fileName="+ URLEncoder.encode(fileName, "UTF-8"));File file = new File(path,fileName);//2、 读取文件--输入流InputStream input=new FileInputStream(file);//3、 写出文件--输出流OutputStream out = response.getOutputStream();byte[] buff =new byte[1024];int index=0;//4、执行 写出操作while((index= input.read(buff))!= -1){out.write(buff, 0, index);out.flush();}out.close();input.close();return null;}

jsp

点击下载

相关内容

热门资讯

新交所迎康哲药业,大中华区上市... 21世纪经济报道记者雷晨 北京报道 7月15日,康哲药业(0867.HK)正式通过“介绍上市”方式在...
拉布布暑期降温,中国潮玩出海弯... 热门款溢价数十倍,“海关大战假拉布布”被网友催更,今年4月以来在国内热度不断上升的拉布布(LABUB...
中考冲刺的作文【实用3篇】 中考冲刺的作文 篇一:如何高效备战中考中考即将来临,作为学生们的重要考试之一,备考工作变得尤为重要。...
中考写人的作文(经典6篇) 中考写人的作文 篇一我的英雄——我的母亲我的母亲是一位普通的农村妇女,但在我心中,她是一位伟大的英雄...
萧瑟的秋天作文(优秀3篇) 萧瑟的秋天作文 篇一秋天,是一个美丽而又寂寥的季节。当枝叶逐渐枯黄,风吹过时发出的沙沙声,让人感到一...