在开发过程中,我们难免遇到提交文件以及下载文件的情况,本篇文章将详细为大家讲解文件上传预与下载,以及上传与下载过程中的注意事项。
案例:添加图书并同时提交图书封面在页面中显示,同时下载图书封面到本地
目录
一、案例准备:
1.1 前端提交文件注意事项
1.2 控制器接受数据和文件的注意事项
二、控制器接收文件:
三、显示图书封面:
3.1 后端传值
3.2 前端接收“封面信息”
四、文件下载:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%--enctype="multipart/form-data"非压缩式提交--%>
1、SpringMvc处理上传文件需要借助于commousMultiPartResolver文件解析器,所以要添加commons-io、commons-fileupload依赖
commons-io
commons-io
2.11.0
commons-fileupload
commons-fileupload
1.3.1
2、在Spring-mvc.xml中配置commousMultiPartResolver文件解析器
在处理文件上传的方法中控制器接收前端传递过来的数据,基本属性可以用对象接收,文件类型的数据使用MultPartFile接收,使用MultPartFile接收前端文件数据的时候,属性名要与表单“name”保持一致
package com.xgsm.Controllers;
import com.xgsm.pojo.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
/**
* Description: SpringmvcFile
* Created by WuHuaSen .
* Created Date: 2022/5/1 13:12
* Version: V1.0
*/
@Controller
@RequestMapping("/book")
public class BookController {
@RequestMapping("/add")
public String addBook(Book book, MultipartFile bookFile, HttpServletRequest request) throws IOException {
System.out.println("----add");
// bookFile就表示上传的图片
// 截取上传文件的后缀名,生成新的文件名
String originalFilename = bookFile.getOriginalFilename();
// 截取后缀名
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
// 生成一个新的文件名
String fileName = System.currentTimeMillis() + substring;
// 获取imgs目录在服务器的路径
String imgPath = request.getSession().getServletContext().getRealPath("imgs");
System.out.println("imgPath:"+imgPath);
// 上传文件的保存路径
String SavePath = imgPath + "/" + fileName;
System.out.println("SavePath:"+SavePath);
// 保存文件
bookFile.transferTo(new File(SavePath));
// 将图片的访问路径设置到book对象
book.setBookImg("imgs/" + SavePath);
// 调用Service中的方法
return "tips";
}
}
前端传值使用ajax异步请求,后端传递数据的时候使用@ResponseBody注解,将值传到前端
@RequestMapping("/list")
@ResponseBody
public String[] listImg(HttpServletRequest request) {
// 从img目录下获取所有图片信息
String dir = request.getSession().getServletContext().getRealPath("imgs");
System.out.println(dir);
File imgDir = new File(dir);
String[] fileName = imgDir.list();
return fileName;
}
前端传值使用ajax异步请求,在Bootstrap中文网中找到一个缩略图样式,回显图片封面的时候将html代码进行拼接。
<%--
Created by IntelliJ IDEA.
User: 25037
Date: 2022/5/1
Time: 13:15
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
图片列表
文件下载功能分为两部分:第一部分,前端点击下载按钮,传给控制器一个当前图片的“图片名”,第二部分,控制器获取缓存区imgs文件夹的路径信息,将传递过来的“图片名”进行拼接,生成图片流,使用响应头将图片另存为即可完成下载功能。
注意:下载实现过程中要将数据类型设置为“浏览器无法识别的类型”,例如exe文件类型
第一部分:前端代码如下:
<%--
Created by IntelliJ IDEA.
User: 25037
Date: 2022/5/1
Time: 13:15
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
图片列表
第二部分:控制器代码如下:
@RequestMapping("/download")
public void downLoad(String fname, HttpServletRequest request, HttpServletResponse response) throws Exception {
// 获取imgs文件夹路径
String dir = request.getSession().getServletContext().getRealPath("imgs");
// 获取图片的路径
String filepath = dir+"/"+fname;
// 原图片文件的流
FileInputStream inputStream = new FileInputStream(filepath);
// 设置用户数据类型
response.setContentType("application/exe");
// 响应头--另存为
response.addHeader("Content-Disposition","attachment;filename="+fname);
IOUtils.copy(inputStream,response.getOutputStream());
}
案例测试:
SpringMvc文件上传与下载案例演示
案例源码下载:
链接:https://pan.baidu.com/s/1z3LdwrL2xZDsKpjDYD-CBw
提取码:xs51