文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver。
前端表单要求:为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器;
对表单中的 enctype 属性做个详细的说明:
一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP响应。在2003年,Apache Software Foundation发布了开源的Commons FileUpload组件,其很快成为Servlet/JSP程序员上传文件的最佳选择。
commons-fileupload commons-fileupload 1.3.3
springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:applicationContext.xml 1 springmvc / encoding org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 encoding /*
CommonsMultipartFile 的 常用方法:
编写前端页面
<%--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" %>
首页
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!
文件下载步骤:
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
点击下载