Spring MVC中实现一个文件上传和下载功能

钜形不锈钢水箱  论坛元老 | 2024-9-27 16:14:54 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1051|帖子 1051|积分 3153

说到文件上传和下载,信赖每个开辟者都有或多或少的打仗过文件上传的功能吧,文件上传和下载是我们在学习计算机网络应用常见的一个功能,主要涉及到用户和服务器之间的数据传输。
我们来对文件上传和下载功能的举行相干概述吧!
文件上传

定义:文件上传是指用户将本地计算机上的文件通过网络传输到服务器的过程。用户通常通过网页表单选择文件并提交,服务器接收并存储该文件。
过程:

  • 用户选择文件:用户在网页上选择要上传的文件,通常通过一个文件输入框(<input type="file">)。
  • 表单提交:用户点击提交按钮,浏览器将文件和其他表单数据一起发送到服务器。
  • HTTP请求:浏览器发起一个HTTP POST请求,包罗文件数据和其他表单字段。
  • 服务器接收文件

    • 服务器接收到请求后,解析请求体中的文件数据。
    • 服务器将文件存储在指定的目录中。

  • 反馈结果:服务器处理完上传后,通常会返回一个响应,告知用户上传是否成功。
文件下载

定义:文件下载是指用户从服务器获取文件并生存到本地计算机的过程。用户通常通过点击链接或按钮来触发下载。
过程:

  • 用户请求下载:用户在网页上点击下载链接或按钮,触发下载请求。
  • HTTP请求:浏览器发起一个HTTP GET请求,请求特定的文件。
  • 服务器处理请求

    • 服务器接收到请求后,查找请求的文件。
    • 服务器将文件内容写入HTTP响应体,并设置恰当的响应头(如Content-Disposition)以指示浏览器下载文件而不是直接体现。

  • 浏览器接收文件:浏览器接收到响应后,开始下载文件并提示用户选择生存位置。
  • 文件生存:用户选择生存位置后,文件被下载到本地计算机。
文件上传和下载的关键步骤

在文件上传和下载的过程中,涉及以下关键步骤:

  • 用户界面:提供文件选择和下载的用户界面(HTML表单)。
  • HTTP请求:使用恰当的HTTP方法(POST用于上传,GET用于下载)发送请求。
  • 请求处理:服务器端代码处理请求,解析文件数据(上传)或查找文件(下载)。
  • 文件存储:在上传过程中,将文件存储在服务器的指定位置。
  • 响应返回:服务器返回处理结果(上传成功/失败)或文件内容(下载)。
  • 错误处理:处理大概出现的错误,如文件大小限制、文件范例验证、文件不存在等。
在SpringMVC中实现一个文件上传和下载的功能

第一步创建我们的文件项目目录结构:
  1. src
  2. └── main
  3.      ├── java
  4.      │   └── com
  5.      │       └── example
  6.      │           └── fileupload
  7.      │               ├── FileUploadController.java
  8.      │               └── WebConfig.java
  9.      ├── resources
  10.      │   └── templates
  11.      │       └── upload.html
  12.      └── web.xml
复制代码
第二步:添加相干依赖
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>org.springframework</groupId>
  4.         <artifactId>spring-webmvc</artifactId>
  5.         <version>5.3.10</version>
  6.     </dependency>
  7.     <dependency>
  8.         <groupId>org.thymeleaf</groupId>
  9.         <artifactId>thymeleaf-spring5</artifactId>
  10.         <version>3.0.12.RELEASE</version>
  11.     </dependency>
  12.     <dependency>
  13.         <groupId>javax.servlet</groupId>
  14.         <artifactId>javax.servlet-api</artifactId>
  15.         <version>4.0.1</version>
  16.         <scope>provided</scope>
  17.     </dependency>
  18. </dependencies>
复制代码
第三步,创建我们的Web设置类,用来监听相干信息
在WebConfig.java中设置Spring MVC:
  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.multipart.commons.CommonsMultipartResolver;
  4. import org.springframework.web.servlet.ViewResolver;
  5. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  6. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  7. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  8. import org.thymeleaf.spring5.SpringTemplateEngine;
  9. import org.thymeleaf.spring5.view.ThymeleafViewResolver;
  10. @Configuration
  11. @EnableWebMvc
  12. public class WebConfig implements WebMvcConfigurer {
  13.     @Bean
  14.     public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
  15.         ThymeleafViewResolver resolver = new ThymeleafViewResolver();
  16.         resolver.setTemplateEngine(templateEngine);
  17.         resolver.setCharacterEncoding("UTF-8");
  18.         resolver.setOrder(1);
  19.         return resolver;
  20.     }
  21.     @Bean
  22.     public CommonsMultipartResolver multipartResolver() {
  23.         CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
  24.         multipartResolver.setMaxUploadSize(10485760); // 10MB
  25.         return multipartResolver;
  26.     }
  27.     @Override
  28.     public void addResourceHandlers(ResourceHandlerRegistry registry) {
  29.         registry.addResourceHandler("/uploads/**").addResourceLocations("file:uploads/");
  30.     }
  31. }
复制代码
创建控制器

在FileUploadController.java中实现文件上传和下载的逻辑:
  1. import org.springframework.stereotype.Controller;
  2. import org.springframework.ui.Model;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.PostMapping;
  5. import org.springframework.web.bind.annotation.RequestParam;
  6. import org.springframework.web.multipart.MultipartFile;
  7. import org.springframework.web.servlet.mvc.support.RedirectAttributes;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.File;
  10. import java.io.FileInputStream;
  11. import java.io.IOException;
  12. import java.io.OutputStream;
  13. @Controller
  14. public class FileUploadController {
  15.     private final String uploadDir = "uploads/";
  16.     @GetMapping("/")
  17.     public String index() {
  18.         return "upload";
  19.     }
  20.     @PostMapping("/upload")
  21.     public String uploadFile(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {
  22.         if (file.isEmpty()) {
  23.             redirectAttributes.addFlashAttribute("message", "请选择一个文件上传!");
  24.             return "redirect:/";
  25.         }
  26.         try {
  27.             // 保存文件
  28.             File dir = new File(uploadDir);
  29.             if (!dir.exists()) {
  30.                 dir.mkdirs();
  31.             }
  32.             File uploadedFile = new File(uploadDir + file.getOriginalFilename());
  33.             file.transferTo(uploadedFile);
  34.             redirectAttributes.addFlashAttribute("message", "文件上传成功:" + file.getOriginalFilename());
  35.         } catch (IOException e) {
  36.             redirectAttributes.addFlashAttribute("message", "文件上传失败:" + e.getMessage());
  37.         }
  38.         return "redirect:/";
  39.     }
  40.     @GetMapping("/download")
  41.     public void downloadFile(@RequestParam("filename") String filename, HttpServletResponse response) {
  42.         File file = new File(uploadDir + filename);
  43.         if (file.exists()) {
  44.             response.setContentType("application/octet-stream");
  45.             response.setHeader("Content-Disposition", "attachment; filename="" + filename + """);
  46.             try (FileInputStream in = new FileInputStream(file);
  47.                  OutputStream out = response.getOutputStream()) {
  48.                 byte[] buffer = new byte[1024];
  49.                 int bytesRead;
  50.                 while ((bytesRead = in.read(buffer)) != -1) {
  51.                     out.write(buffer, 0, bytesRead);
  52.                 }
  53.             } catch (IOException e) {
  54.                 e.printStackTrace();
  55.             }
  56.         } else {
  57.             response.setStatus(HttpServletResponse.SC_NOT_FOUND);
  58.         }
  59.     }
  60. }
复制代码
第五步,创建HTML模板
  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4.     <title>文件上传</title>
  5. </head>
  6. <body>
  7. <h1>文件上传</h1>
  8. <form method="post" enctype="multipart/form-data" th:action="@{/upload}">
  9.     <input type="file" name="file" required/>
  10.     <button type="submit">上传</button>
  11. </form>
  12. <div th:if="${message}" th:text="${message}"></div>
  13. <h2>下载文件</h2>
  14. <form method="get" th:action="@{/download}">
  15.     <input type="text" name="filename" placeholder="输入文件名" required/>
  16.     <button type="submit">下载</button>
  17. </form>
  18. </body>
  19. </html>
复制代码
最后一步,设置web.xml文件
  1. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  2.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
  4.          http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5.          version="3.1">
  6.     <servlet>
  7.         <servlet-name>dispatcher</servlet-name>
  8.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  9.         <load-on-startup>1</load-on-startup>
  10.     </servlet>
  11.     <servlet-mapping>
  12.         <servlet-name>dispatcher</servlet-name>
  13.         <url-pattern>/</url-pattern>
  14.     </servlet-mapping>
  15.     <context-param>
  16.         <param-name>contextConfigLocation</param-name>
  17.         <param-value>/WEB-INF/applicationContext.xml</param-value>
  18.     </context-param>
  19.     <listener>
  20.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  21.     </listener>
  22. </web-app>
复制代码

  1. 14:18:08.583 [http-nio-8008-exec-6] DEBUG org.springframework.web.servlet.DispatcherServlet - POST "/SpringMVC/upload", parameters={}
  2. 14:18:08.595 [http-nio-8008-exec-6] DEBUG org.springframework.web.multipart.commons.CommonsMultipartResolver - Part 'file', size 719635 bytes, filename='白底logo.png'
  3. 14:18:08.596 [http-nio-8008-exec-6] DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped to com.miaow.controller.FileUploadController#uploadFile(MultipartFile, RedirectAttributes)
  4. 14:18:08.600 [http-nio-8008-exec-6] DEBUG org.springframework.web.multipart.commons.CommonsMultipartFile - Part 'file',  filename '白底logo.png': moved to [D:\IDEATomcat\apache-tomcat-9.0.89-windows-x64\apache-tomcat-9.0.89\bin\uploads\白底logo.png]
  5. 14:18:08.600 [http-nio-8008-exec-6] DEBUG org.springframework.web.servlet.view.RedirectView - View name 'redirect:', model {}
  6. 14:18:08.601 [http-nio-8008-exec-6] DEBUG org.springframework.web.multipart.commons.CommonsMultipartResolver - Cleaning up part 'file', filename '白底logo.png'
  7. 14:18:08.601 [http-nio-8008-exec-6] DEBUG org.springframework.web.servlet.DispatcherServlet - Completed 302 FOUND
  8. 14:18:08.608 [http-nio-8008-exec-5] DEBUG org.springframework.web.servlet.DispatcherServlet - GET "/SpringMVC/", parameters={}
  9. 14:18:08.608 [http-nio-8008-exec-5] DEBUG org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped to ParameterizableViewController [view="index"]
  10. 14:18:08.610 [http-nio-8008-exec-5] DEBUG org.springframework.web.servlet.DispatcherServlet - Completed 200 OK
  11. 14:18:12.924 [http-nio-8008-exec-10] DEBUG org.springframework.web.servlet.DispatcherServlet - GET "/SpringMVC/upload", parameters={}
  12. 14:18:12.924 [http-nio-8008-exec-10] DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped to com.miaow.controller.FileUploadController#index()
  13. 14:18:12.925 [http-nio-8008-exec-10] DEBUG org.springframework.web.servlet.DispatcherServlet - Completed 200 OK
复制代码
上传成功日记。
下载成功日记:
  1. 14:19:16.956 [http-nio-8008-exec-9] DEBUG org.springframework.web.servlet.DispatcherServlet - GET "/SpringMVC/download?filename=violet.webp", parameters={masked}
  2. 14:19:16.956 [http-nio-8008-exec-9] DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped to com.miaow.controller.FileUploadController#downloadFile(String, HttpServletResponse)
  3. 14:19:16.958 [http-nio-8008-exec-9] DEBUG org.springframework.web.servlet.DispatcherServlet - Completed 200 OK
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

钜形不锈钢水箱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表