基于Spring MVC实现文件上传和下载

一、步骤

1.引入相关依赖pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zjd</groupId><artifactId>chapter13-2</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><project.build.sourceEncoding>UTF-9</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target></properties><dependencies><!--        Spring核心类--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.8.RELEASE</version></dependency><!--        Spring MVC--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.8.RELEASE</version></dependency><!--        servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--        JSP--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.2</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.2</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.0</version></dependency></dependencies></project>

2.搭建Spring MVC环境(配置前端控制器)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--    配置Spring MVC的前端配置器--><servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--        配置初始化参数,用于读取Spring MVC的配置文件--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><!--        应用加载时创建--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

3.创建Spring MVC配置文件spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--配置Spring MVC要扫描的包--><context:component-scan base-package="com.zjd"/><!--    配置注解驱动--><mvc:annotation-driven/><!--    配置静态资源的访问映射,此配置中的文件将不被前端控制器拦截--><mvc:resources mapping="/js/**" location="/js/"/><!--    配置视图解析器--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--        设置请求编码格式,必须与JSP中的pageEncoding属性一致,默认为ISO-8859-1--><property name="defaultEncoding" value="UTF-8"/><!--        设置允许上传文件的最大值为2M,单位为字节--><property name="maxUploadSize" value="2097152"/></bean>
</beans>

4.创建files.json文件(负责记录我们上传的文件)

5.创建与files.json内容对应的资源类Resource.java

package com.zjd.pojo;public class Resource {private String name;public Resource() {}public Resource(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

6.创建JSON工具类JSONFileUtils.java

package com.zjd.utils;import org.apache.commons.io.IOUtils;import java.io.FileInputStream;
import java.io.FileOutputStream;public class JSONFileUtils {public static String readFile(String filepath) throws Exception {FileInputStream fileInputStream = new FileInputStream(filepath);return IOUtils.toString(fileInputStream);}public static void writeFile(String data, String filepath) throws Exception {FileOutputStream fileOutputStream = new FileOutputStream(filepath);IOUtils.write(data, fileOutputStream);}
}

7.创建文件控制类FileController.java

package com.zjd.controller;import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zjd.pojo.Resource;
import com.zjd.utils.JSONFileUtils;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
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 sun.misc.BASE64Encoder;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;@Controller
public class FileController {/** 文件上传* */@RequestMapping("/fileUpLoad")public String fileUpLoad(MultipartFile[] files, HttpServletRequest request) throws Exception {//设置上传的文件所存放的路径String path = request.getServletContext().getRealPath("/") + "files/";ObjectMapper mapper = new ObjectMapper();if (files != null && files.length > 0) {//循环获取上传的文件for (MultipartFile file : files) {//获取上传文件的名称String filename = file.getOriginalFilename();ArrayList<Resource> list = new ArrayList<>();//读取files.json文件中的文件名称String json = JSONFileUtils.readFile(path + "/files.json");if (json.length() != 0) {//将files.json的内容转为集合list = mapper.readValue(json, new TypeReference<List<Resource>>() {});for (Resource resource : list) {//如果上传的文件在files.json文件中有同名文件,将当前上传的文件重命名,以避免重名if (filename.equals(resource.getName())) {String[] split = filename.split("\\.");filename = split[0] + "(1)." + split[1];}}}//文件保存的全路径String filePath = path + filename;//保存上传的文件file.transferTo(new File(filePath));list.add(new Resource(filename));json = mapper.writeValueAsString(list);//将集合转换成json//将上传文件的名称保存在files.json中JSONFileUtils.writeFile(json, path + "/files.json");}request.setAttribute("msg", "(上传成功)");return "forward:fileload.jsp";}request.setAttribute("msg", "(上传失败)");return "forward:fileload.jsp";}@ResponseBody@RequestMapping(value = "/getFilesName", produces = "text/html;character=utf-8")public String getFilesName(HttpServletRequest request, String response) throws Exception {String path = request.getServletContext().getRealPath("/") + "files/files.json";String json = JSONFileUtils.readFile(path);return json;}/** 根据浏览器的不同进行编码设置,返回编码后的文件名* */public String getFileName(HttpServletRequest request, String filename) throws Exception {BASE64Encoder base64Encoder = new BASE64Encoder();String agent = request.getHeader("User-Agent");if (agent.contains("Firefox")) {//火狐浏览器filename = "=?UTF-8?B?" + new String(base64Encoder.encode(filename.getBytes("UTF-8")) + "?=");} else {//IE及其他浏览器filename = URLEncoder.encode(filename, "UTF-8");}return filename;}/** 文件下载* */@RequestMapping("/download")public ResponseEntity<byte[]> fileDownload(HttpServletRequest request,String filename)throws Exception{//指定要下载的文件所在路径String path=request.getServletContext().getRealPath("/files/");filename =new String(filename.getBytes("ISO-8859-1"),"UTF-8");//创建该文件对象File file=new File(path+File.separator+filename);//设置响应头HttpHeaders headers=new HttpHeaders();filename=this.getFilesName(request,filename);//通知浏览器以下载的方式打开文件headers.setContentDispositionFormData("attachment",filename);//定义以流的形式下载返回文件数据headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//使用String MVC框架的ResponseEntity对象封装返回下载数据return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);}
}

8.编写文件上传和下载页面fileload.jsp

<%--Created by IntelliJ IDEA.User: 24360Date: 2022/12/4Time: 16:42To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>文件上传与下载</title><script src="${pageContext.request.contextPath}/js/jquery.min.js" type="text/javascript"></script>
</head>
<body>
<table border="1"><tr><td width="200" align="center">文件上传${msg}</td><td width="300" align="center">下载列表</td></tr><tr><td height="100"><form action="${pageContext.request.contextPath}/fileUpLoad" method="post" enctype="multipart/form-data"><input type="file" name="files" multiple="multiple"><br/><input type="reset" value="清空"/><input type="submit" value="提交"/></form></td><td id="files"></td></tr>
</table>
</body>
<script>$(document).ready(function () {var url = "${pageContext.request.contextPath}/getFilesName";$.get(url, function (files) {var files = eval('(' + files + ')');for (var i = 0; i < files.length; i++) {$("#files").append("<li><a href=${pageContext.request.contextPath}" + "\\" + "download?filename=" + files[i].name + ">" + files[i].name + "</a></li>");}})})
</script>
</html>

9.引入JSON脚本文件jquery.min.js

二、项目结构

三、本次完成案例:基于Spring MVC实现文件上传与下载

主要是对文件上传与下载的过程进一步了解并实现

四、重要讯息!!!!!

各位小伙伴有疑问可以私聊我,我会在每周日统一查看回复

路过的小伙伴,该篇文章如果对你有帮助,请留下你的小手(

Mr.张小白(案例:基于Spring MVC实现文件上传和下载)相关推荐

  1. Spring MVC的文件上传和下载以及拦截器

    一.文件上传 在使用form表单进行文件上传时,必须将method设置为 post,并将enctype设置为multipart/form-data.只有这样设置,浏览器才会将需要上传的文件已二进制数据 ...

  2. 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现

    文章目录 基于Spring Boot的文件上传下载功能模块的设计与实现 1.前言 2.技术栈 3.关键源码 4.实现效果 4.1.登录 4.2.文件列表 4.3.上传文件测试 4.3.1.测试图片 4 ...

  3. 基于FTP协议实现文件上传与下载

    目录 一.FTP简介 二.关于FTP服务器 三.文件上传 分步讲解: 完整实现代码: 四.下载文件 分步讲解: 完整实现代码: 小结 一.FTP简介 FTP(File Transfer Protoco ...

  4. 【Spring MVC】文件上传、文件下载

    页面效果: 一.文件下载 1.访问资源时相应头如果没有设置 Content-Disposition,浏览器默认按照 inline 值进行处理 1.1 inline 能显示就显示,不能显示就下载. 2. ...

  5. java之spring mvc之文件上传

    目录结构如下: 注意,下面说的配置文件,一般都是值的src下的配置文件,即mvc.xml.如果是web.xml,则直接说 web.xml 1. 文件上传的注意点 表单必须是post提交,必须将 enc ...

  6. 【Spring】SpringMVC文件上传与下载

    对于上传功能,我们在项目中是经常会用到的,比如用户注册的时候,上传用户头像,这个时候就会使用到上传的功能.而对于下载,使用场景也很常见,比如我们项目中有个使用说明是是pdf版的,会提供给用户进行下载的 ...

  7. 基于tornado服务器的文件上传和下载

    文章目录 文件上传的服务端技术解析 基于Ajax技术实现的文件上传客户端 方法1:使用 ajaxfileupload.js 方法2:仅依赖 jquery.js 文件下载的服务端技术解析 文件上传的服务 ...

  8. 基于TCP协议的文件上传与下载

    一.前言 TCP协议:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793 定义.传输控制 ...

  9. ASP.NET MVC图片文件上传与下载

    说明: 前后端代码中均只用到 ASP.NET MVC原生的技术,不需要用到ajax,WebAPI等. 下篇文章[ jQuery + Ajax + WebAPI 上传文件]会介绍使用Ajax POST来 ...

最新文章

  1. wamp配置虚拟主机
  2. 嵌入式开发中DSP与FPGA的关系
  3. @EnableGlobalMethodSecurity(prePostEnabled = true)
  4. mac OS X中升级php5.5至php5.6 or php7
  5. pointnet分割自己的点云数据_点云学习历史文章大汇总
  6. php获取url返回的json,【求助】本地页面如何取某个URL返回的json
  7. 我的第一个C++程序——方块游戏 v1.0
  8. 系统不做限流,我看你是对中国人口数量有什么误解
  9. 下载UBUNTU的可用链接
  10. 怎么才能转到计算机专业申请书,大学转专业的申请书范文
  11. matlab对矩阵模板卷积,矩阵卷积Matlab(转载)
  12. STM32实战总结:HAL之数码管
  13. 如何用python画房子_用python画一个小房子
  14. SylixOS中断延迟队列
  15. 宽屏扁平化结婚恋爱整站HTML5模板
  16. 博鳌亚洲论坛今天闭幕,都有哪些值得互联网行业关注的精华?
  17. K8S系列:Pod 的恢复策略restartPolicy
  18. HEIF格式怎么转换图片?教你一个小技巧
  19. 20100919星期天最折磨人的一天。
  20. 计算机程序设计员理论练习

热门文章

  1. ORCAD 打开session log
  2. 在html中列表是块元素还是,HTML基础知识4-列表及表单的写法、块级元素和内联(行内)元素的区别...
  3. Web迅雷带来的...
  4. 深度相机学习(一)Kinect的配置
  5. Vue+SpringBoot 实现Excel表下拉框与模板文件下载
  6. IDirect3DSurface9 GetDC失败
  7. ubuntu如何播放wmv格式
  8. python打砖块游戏程序设计报告_实现打砖块小游戏.py
  9. OSDI’21 GNN 相关论文摘记
  10. 心理学:人与人之间的相处之道,说白了就这四个字