Java课程实验 Spring Boot 文件上传与下载

简介: Java课程实验 Spring Boot 文件上传与下载

一、实验目的

1.文件上传

2.文件下载

二、实验内容

1.掌握 Spring Boot 中 MVC 功能的定制和扩展

2.掌握 Spring Boot 整合 Servlet 三大组件的实现

3.掌握 Spring Boot 文件上传与下载的实现

三、实验步骤及截图

1.使用Idea+Maven新建项目,并对Idea必要配置。

2.导入数据库,配置POM.xml引入commons-io等必要包。

3.编写 全局配置文件 application.properties,配置上传下载参数等。

4.编写入口类。

1. @EnableCaching
2. 
3. @ServletComponentScan
4. 
5. @SpringBootApplication
6. 
7. public class Chapter04MySQL {
8. 
9.     public static void main(String[] args) {
10. 
11.         SpringApplication.run(Chapter04MySQL.class);
12. 
13.     }
14. 
15. }

5.编写controller类,实现文件上传功能。

1. @Controller
2. 
3. public class FileController {
4. 
5.     String pathParent = "G:/File";
6. 
7.     //向文件上传页面跳转
8. 
9.     @GetMapping("/toUpload")
10. 
11.     public String toUpload(){
12. 
13.         return "file/upload";
14. 
15.     }
16. 
17.     //文件上传管理
18. 
19.     @PostMapping("/uploadFile")
20. 
21.     public String uploadFile(MultipartFile[] fileUpload, Model model) {
22. 
23.         //上传成功返回状态信息
24. 
25.         model.addAttribute("uploadStatus", "上传成功!");
26. 
27.         for (MultipartFile file : fileUpload) {
28. 
29.             //获取文件名以及后缀名
30. 
31.             String fileName = file.getOriginalFilename();
32. 
33.             //重新生成文件名
34. 
35.             fileName = UUID.randomUUID()+"_"+fileName;
36. 
37.             //指定上传文件本地存储目录,不存在则需创建
38. 
39.             String dirPath = pathParent+"/upload/";
40. 
41.             File filePath = new File(dirPath);
42. 
43.             if(!filePath.exists()){
44. 
45.                 filePath.mkdirs();
46. 
47.             }
48. 
49.             try {
50. 
51.                 file.transferTo(new File(dirPath+fileName));
52. 
53.             } catch (Exception e) {
54. 
55.                 e.printStackTrace();
56. 
57.                 //上传失败返回失败信息
58. 
59.                 model.addAttribute("uploadStatus","上传失败: "+e.getMessage());
60. 
61.             }
62. 
63.         }
64. 
65.         //携带上传状态信息回调到文件上传页面
66. 
67.         return "file/upload";
68. 
69.     }
70. 
71. }

6.编写controller类,实现文件下载功能。

1. //向文件下载页面跳转
2. 
3.     @GetMapping("/toDownload")
4. 
5.     public String toDownload(){
6. 
7.         return "file/download";
8. 
9.     }
10. 
11. 
12. 
13.     @GetMapping("/download")
14. 
15.     //所有类型文件下载管理
16. 
17.     public ResponseEntity<byte[]> fileDownload(HttpServletRequest request, String filename) throws Exception{
18. 
19.         //指定要下载的文件根路径
20. 
21.         String dirPath = pathParent+"/download/";
22. 
23.         //创建该文件对象
24. 
25.         File file = new File(dirPath + File.separator + filename);
26. 
27.         //设置响应头
28. 
29.         HttpHeaders headers = new HttpHeaders();
30. 
31.         //通知浏览器已下载方式打开(下载前对文件名进行转码)
32. 
33.         filename=getFilename(request,filename);
34. 
35.         headers.setContentDispositionFormData("attachment",filename);
36. 
37.         //定义以流的方式下载返回文件数据
38. 
39.         headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
40. 
41.         try {
42. 
43.             return new ResponseEntity<>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
44. 
45.         } catch (Exception e) {
46. 
47.             e.printStackTrace();
48. 
49.             return new ResponseEntity<byte[]>(e.getMessage().getBytes(),HttpStatus.EXPECTATION_FAILED);
50. 
51.         }
52. 
53.     }

7.编写前端页面,实现文件上传页面。

1. <!DOCTYPE html>
2. 
3. <html lang="en" xmlns:th="http://www.thymeleaf.org">
4. 
5. <head>
6. 
7.     <meta charset="UTF-8">
8. 
9.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
10. 
11.     <title>文件上传</title>
12. 
13.     <link th:href="@{/login/css/bootstrap.min.css}" rel="stylesheet">
14. 
15.     <script th:src="@{/login/js/jquery.min.js}"></script>
16. 
17. </head>
18. 
19. <body>
20. 
21. <div th:if="${uploadStatus}" style="color: red" th:text="${uploadStatus}">上传成功</div>
22. 
23. <form th:action="@{/uploadFile}" method="post" enctype="multipart/form-data">上传文件:&nbsp;&nbsp;
24. 
25.     <input type="button" value="添加文件" onclick="add()"/>
26. 
27.     <div id="file" style="margin-top: 10px;" th:value="上传区域"></div>
28. 
29.     <input id="submit" type="submit" value="文件上传" style="display: none;margin-top: 10px;"/>
30. 
31. </form>
32. 
33. <script type="text/javascript">
34. 
35.     function add() {
36. 
37.         var innerdiv = "<div>";
38. 
39.         innerdiv += "<input type='file' name='fileUpload' required='required'>"+
40. 
41.                     "<input type='button' value='删除' onclick='remove(this)'>";
42. 
43.         innerdiv += "<div>";
44. 
45.         $("#file").append(innerdiv);
46. 
47.         $("#submit").css("display","block");
48. 
49.     }
50. 
51.     //删除当前行
52. 
53.     function remove(obj) {
54. 
55.         $(obj).parent().remove();
56. 
57.         if ($("#file div").length == 0){
58. 
59.             $("#submit").css("display","none");
60. 
61.         }
62. 
63.     }
64. 
65. </script>
66. 
67. </body>
68. 
69. </html>

8.编写前端页面,实现文件下载页面。

1.  <!DOCTYPE html>
2. 
3. <html lang="en" xmlns:th="http://www.thymeleaf.org">
4. 
5. <head>
6. 
7.     <meta charset="UTF-8">
8. 
9.     <title>文件下载</title>
10. 
11. </head>
12. 
13. <body>
14. 
15. <div style="margin-bottom: 10px">文件下载列表:</div>
16. 
17. <table>
18. 
19.     <tr>
20. 
21.         <td>bloglogo.jpg</td>
22. 
23.         <td><a th:href="@{/download(filename='bloglogo.jpg')}">下载文件</a > </td>
24. 
25.     </tr>
26. 
27.     <tr>
28. 
29.         <td>第5章 SpringBoot实现Web开发.ppt</td>
30. 
31.         <td><a th:href="@{/download(filename='第5章 SpringBoot实现Web开发.ppt')}">下载文件</a > </td>
32. 
33.     </tr>
34. 
35. </table>
36. 
37. </body>
38. 
39. </html>

9.编写controller类,实现中文文件名文件下载功能。

1. //根据浏览器的不同编码设置,返回编码的文件名
2. 
3.     private String getFilename(HttpServletRequest request, String filename)
4. 
5.             throws Exception {
6. 
7.         //IE不同版本User-Agent中出现的关键字
8. 
9.         String[] IEBrowserKeyWords = {"MSIE", "Trident", "Edge"};
10. 
11.         //获取请求头代理信息
12. 
13.         String userAgent = request.getHeader("User-Agent");
14. 
15.         for (String keyWord : IEBrowserKeyWords) {
16. 
17.             if (userAgent.contains(keyWord)) {
18. 
19.                 //IE内核浏览器,统一为UTF-8编码显示,并对转换的+进行更正
20. 
21.                 return URLEncoder.encode(filename, "UTF-8").replace("+"," ");
22. 
23.             }
24. 
25.         }
26. 
27.         //火狐等其他浏览器统一为ISO-8859-1编码显示
28. 
29.         return new String(filename.getBytes("UTF-8"), "ISO-8859-1");
30. 
31.     }

四、实验中遇到的问题及采取的措施(10分)

报错1:org.thymeleaf.exceptions.TemplateInputException: Error resolving template [file/download], template might not exist or might not be accessible by any of the configured Template Resolvers。

排错过程1:

第一步,检查templates是否放在resource下面。

第二步,检查templates是否拼写有误。

原因分析1:

这个错误信息是Thymeleaf模板引擎报错,通常是因为找不到指定的模板文件。你需要检查一下你的文件路径和文件名是否正确,确保模板文件存在于你指定的位置,并且有足够的读取权限。同时,你还需要确定你所使用的 Template Resolver 配置是正确的,能够解析出你的模板文件。

注:由于源码量过多,需要的朋友可在资源中下载,也可私信我拿取!

目录
相关文章
|
4天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
12 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
21天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
21天前
|
缓存 Java 数据库
【Java面试题汇总】Spring篇(2023版)
IoC、DI、aop、事务、为什么不建议@Transactional、事务传播级别、@Autowired和@Resource注解的区别、BeanFactory和FactoryBean的区别、Bean的作用域,以及默认的作用域、Bean的生命周期、循环依赖、三级缓存、
【Java面试题汇总】Spring篇(2023版)
|
11天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
554 6
|
11天前
|
存储 缓存 监控
Java——图片文件位于 bin 目录下,下载新图片会导致应用程序重启
【9月更文挑战第22天】在Java应用中,若图片位于bin目录下且下载新图片导致应用重启,可能是因为部署方式不当或资源监控机制过于敏感。解决方法包括:更改图片存储位置至独立目录;配置应用服务器减少资源监控敏感度;使用独立资源服务器托管静态资源;优化代码减少资源重复加载。具体方案需根据应用实际情况和技术栈调整。
|
11天前
|
JSON 前端开发 JavaScript
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
43 2
|
22天前
|
Java 数据库连接 API
【Java笔记+踩坑】Spring Data JPA
从常用注解、实体类和各层编写方法入手,详细介绍JPA框架在增删改查等方面的基本用法,以及填充用户名日期、分页查询等高级用法。
【Java笔记+踩坑】Spring Data JPA
|
22天前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
2月前
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
31 0
|
10天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
32 2
基于Java+Springboot+Vue开发的服装商城管理系统
下一篇
无影云桌面