一.文件上传 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver
1.前端
为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器;
设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,之前使用的commons-fileupload是Servlet/JSP程序员上传文件的最佳选择,Servlet3.0规范已经提供方法来处理文件上传,但这种上传需要在Servlet中完成。而Spring MVC则提供了更简单的封装,即直接用multipartResolver实现。
2.导包
commons-fileupload
commons-fileupload
1.3.3
javax.servlet
javax.servlet-api
4.0.1
3. springmvc-servlet.xml配置
bena的id必须为:multipartResolver , 否则上传文件会报400的错误
4.采用流的方式上传文件
Tip:@RequestParam(“file”) 将name=file控件得到的文件封装成CommonsMultipartFile 对象,我们在上面的前端配置的地方将input类型为file的标签的name设置为了file,所以这里注解内也为file
【SpringMVC|SpringMVC文件上传和文件下载】实现思路:
1.首先获取上传文件的文件名
2.设置上传文件的保存路径
3.使用字节输入流和字节输出流实现文件上传
4.关闭流
@Controller
public class FileController {
//采用流的方式上传文件
@RequestMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file")CommonsMultipartFile file, HttpServletRequest request) throws IOException {
//获得文件名
String filename = file.getOriginalFilename();
if ("".equals(filename)){
return "文件不存在";
}
//上传文件保存路径
String path = request.getServletContext().getRealPath("/upload");
File realPath = new File(path);
if (!realPath.exists()){
realPath.mkdir();
}
//文件上传
InputStream inputStream = file.getInputStream();
FileOutputStream outputStream = new FileOutputStream(new File(realPath, filename));
int len = 0;
byte[] bytes = new byte[1024];
while ((len=inputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
//关闭流
outputStream.close();
inputStream.close();
return "上传完毕";
}
}
5.使用file.Transto上传文件
除了使用流的方式上传文件,我们还可以使用Transto方法上传文件
@Controller
public class FileController {
//采用file.Transto上传文件
@RequestMapping("/upload2")
@ResponseBody
public String upload2(@RequestParam("file") CommonsMultipartFile file,HttpServletRequest request) throws IOException {
//上传文件保存路径
String path = request.getServletContext().getRealPath("/upload");
File realPath = new File(path);
if (!realPath.exists()){
realPath.mkdir();
}
//transferTo将文件写入磁盘,参数传入一个文件
file.transferTo(new File(realPath+"/"+file.getOriginalFilename()));
return "上传完毕";
}
}
二、SpringMVC实现文件下载
package org.westos.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@Controller
public class DownloadController {
@RequestMapping("/download2")
public String download(HttpServletRequest request, HttpServletResponse response) {
String fileName = "1.png";
System.out.println(fileName);
response.setContentType("text/html;
charset=utf-8");
try {
request.setCharacterEncoding("UTF-8");
//设定请求字符编码
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
BufferedInputStream bis = null;
//创建输入输出流
BufferedOutputStream bos = null;
String realPath = request.getSession().getServletContext().getRealPath("/") + "upload/";
//获取文件真实路径
System.out.println(realPath);
String downLoadPath = realPath + fileName;
System.out.println(downLoadPath);
try {
long fileLength = new File(downLoadPath).length();
//获取文件长度
//设置响应头信息;【固定的不用记,保存即可】
response.setContentType("application/x-msdownload;
");
response.setHeader("Content-disposition", "attachment;
filename=" + new String(fileName.getBytes("utf-8"), "ISO8859-1"));
response.setHeader("Content-Length", String.valueOf(fileLength));
bis = new BufferedInputStream(new FileInputStream(downLoadPath));
//创建输入输出流实例
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
//创建字节缓冲大小
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null)
try {
bis.close();
//关闭输入流
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (bos != null)
try {
bos.close();
//关闭输出流
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
}
推荐阅读
- java|Java学习日记14(SpringMVC的请求-配置文件的知识总结)
- Spring|SpringMVC获得请求数据-文件上传
- springboot|spring boot多数据源动态切换, 多数据源事务管理
- springboot|从零开始搭建springboot项目骨架
- Java后端|Spring Boot知识系列—Spring Boot整合日志框架【详解】
- 技术分享|使用 SpringBoot + Redis + Vue3 + ArcoPro 开发管理系统
- spring|SpringCloud学习笔记
- java|谷粒商城-02-p20-p27
- 中间件|基于SpringBoot+MyBatis+Vue的音乐网站