Spring MVC 中的文件上傳 和 文件下載

Spring MVC 中的文件上傳 和 文件下載

文章目錄

  • Spring MVC 中的文件上傳 和 文件下載
  • 1. Spring MVC 中的文件上傳
  • 2. Spring MVC 中的文件下載
  • 3. 總結:
  • 4. 最后:


1. Spring MVC 中的文件上傳

文件上傳是:瀏覽器端向服務器發送文件,最終服務器將文件保存到服務器上

文件上傳需要添加如下依賴,注意:使用 Spring MVC 6版本,不需要添加以下依賴:

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.5</version>
</dependency>

前端頁面:

注意:

文件上傳必須是 post 請求,因為文件是大數據。get 請求不夠

文件上傳的form標簽中必須使用 enctype=“multipart/form-data”

enctype是用來設置請求頭的內容類型的,默認值是: enctype=“application/x-www-form-urlencoded”
文件上傳的組件是: 文件上傳: <input type="file" name="fileName">

在這里插入圖片描述

在這里插入圖片描述

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>文件上傳與下載</title>
</head>
<body>
<h1>文件上傳下載</h1>
<hr><h2>測試</h2>
<!--文件上傳,大文件,一定要用 post 請求才行-->
<!--文件上傳表單-->
<form th:action="@{/fileup}" method="post" enctype="multipart/form-data">文件:<input type="file" name="fileName"/><br><input type="submit" value="上傳">
</form>
<br></body>
</html>

重點是:form表單采用post請求,enctype是multipart/form-data,并且上傳組件是:type=“file”

web.xml文件:

注意:如果你用的是:Spring6 ,那么需要在web.xml 文件的 DispatcherServlet中進入如下的配置:

<multipart-config>
<!--設置單個支持最大文件的大小-->
<max-file-size>102400</max-file-size>
<!--設置整個表單所有文件上傳的最大值-->
<max-request-size>102400</max-request-size>
<!--設置最小上傳文件大小-->
<file-size-threshold>0</file-size-threshold>
</multipart-config>

在這里插入圖片描述

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"version="5.0"><!--    字符編碼過濾器--><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceRequestEncoding</param-name><param-value>true</param-value></init-param><init-param><param-name>forceResponseEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--    前端控制器--><servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup><multipart-config><!--設置單個支持最大文件的大小--><max-file-size>10240000</max-file-size><!--設置整個表單所有文件上傳的最大值--><max-request-size>10240000</max-request-size><!--設置最小上傳文件大小--><file-size-threshold>0</file-size-threshold></multipart-config></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><!--        除了 jsp 頁面其他的都走這個--><url-pattern>/</url-pattern></servlet-mapping><!--    添加一個過濾器,這個過濾器是springmvc提前寫好的,直接用就行了,這個過濾器可以幫助你將請求POST轉換成PUT請求/DELETE請求--><!--    同時注意:該過濾器一定要在字符編碼過濾器后面配置,不然,先設置的話,可能會出現獲取到的請求數據是亂碼--><filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter-mapping><filter-name>HiddenHttpMethodFilter</filter-name><!--        表示任意的 請求--><url-pattern>/*</url-pattern></filter-mapping></web-app>

重點:在DispatcherServlet配置時,添加 multipart-config 配置信息。(這是Spring6,如果是Spring5,則不是這樣配置,而是在springmvc.xml文件中配置:CommonsMultipartResolver)
SpringMVC6中把這個類已經刪除了。廢棄了。

文件上傳的 Controller 代碼編寫:

在這里插入圖片描述

package com.rainbowsea.springmvc.controller;import jakarta.servlet.ServletContext;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;import javax.lang.model.element.VariableElement;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.UUID;@Controller
public class FileController {@RequestMapping(value = "/fileup",method = RequestMethod.POST)public String fileup(@RequestParam("fileName")MultipartFile multipartFile, HttpServletRequest request) throws Exception {// 獲取請求參數的名字String name = multipartFile.getName();System.out.println(name);  // fileName (前端    文件上傳: <input type="file" name="fileName"><br> )// 獲取的是文件真實的名字String originalFilename = multipartFile.getOriginalFilename();System.out.println(originalFilename);  // xiaomu// 接下來就是看在 Java SE 當中的IO 功底了// 一邊讀,一邊寫//讀什么?寫什么// 讀客戶端傳過來的文件,寫倒服務器上// 輸入流InputStream in = multipartFile.getInputStream(); // 輸入流,負責讀客戶端的文件BufferedInputStream bis = new BufferedInputStream(in); // 封裝成帶有緩沖區的輸入流// 輸出流//BufferedOutputStream 文件的路徑 = new BufferedOutputStream((new FileOutputStream("文件的路徑")));ServletContext application = request.getServletContext();String realPath = application.getRealPath("/upload");File file = new File(realPath);// 文件不存在,就創建,存在不創建if(!file.exists()) {file.mkdirs();}File destFile = new File(file.getAbsoluteFile() + "/" + originalFilename);//BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(destFile));// 可以采用UUID來生成文件名,防止服務器上傳文件時產生覆蓋BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file.getAbsolutePath() + "/" + UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."))));// 一邊讀一邊寫byte[] bytes = new byte[1024 * 10];int readCount = 0;while ((readCount = bis.read(bytes))!=-1) {bufferedOutputStream.write(bytes,0,readCount);}bufferedOutputStream.flush();bufferedOutputStream.close();bis.close();return "ok";}//@RequestMapping(value = "/fileup", method = RequestMethod.POST)/* public String fileUp(@RequestParam("fileName") MultipartFile multipartFile, HttpServletRequest request) throws IOException {String name = multipartFile.getName();System.out.println(name);// 獲取文件名String originalFilename = multipartFile.getOriginalFilename();System.out.println(originalFilename);// 將文件存儲到服務器中// 獲取輸入流InputStream in = multipartFile.getInputStream();// 獲取上傳之后的存放目錄File file = new File(request.getServletContext().getRealPath("/upload"));// 如果服務器目錄不存在則新建if(!file.exists()){file.mkdirs();}// 開始寫//BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file.getAbsolutePath() + "/" + originalFilename));// 可以采用UUID來生成文件名,防止服務器上傳文件時產生覆蓋BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file.getAbsolutePath() + "/" + UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."))));byte[] bytes = new byte[1024 * 100];int readCount = 0;while((readCount = in.read(bytes)) != -1){out.write(bytes,0,readCount);}// 刷新緩沖流out.flush();// 關閉流in.close();out.close();return "ok";}*/
}

最終測試結果:

在這里插入圖片描述

注意: 上傳文件時,文件起名采用UUID。以防文件覆蓋。

2. Spring MVC 中的文件下載

文件下載是:將服務器當中的文件,下載到本地客戶端當中

前端頁面:

在這里插入圖片描述

<!--文件下載-->
<a th:href="@{/download}">文件下載</a>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>文件上傳與下載</title>
</head>
<body>
<h1>文件上傳下載</h1>
<hr><h2>測試</h2><!--文件下載-->
<h1>下載</h1>
<a th:href="@{/download}">文件下載</a></body>
</html>

文件下載核心程序,使用ResponseEntity:

在這里插入圖片描述


import jakarta.servlet.ServletContext;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;import javax.lang.model.element.VariableElement;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.UUID;@Controller
public class FileController {@GetMapping("/download")public ResponseEntity<byte[]> downloadFile(HttpServletRequest request) throws IOException {File file = new File(request.getServletContext().getRealPath("/upload") + "xiaomu.jpeg");// 創建響應頭對象HttpHeaders httpHeaders = new HttpHeaders();// 設置響應內容類型httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);// 設置下載文件的名稱httpHeaders.setContentDispositionFormData("attachment",file.getName());// 下載文件ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(Files.readAllBytes(file.toPath()), httpHeaders, HttpStatus.OK);return entity;}
}

效果:

在這里插入圖片描述

3. 總結:

  1. 文件上傳:form表單采用post請求,enctype是multipart/form-data,并且上傳組件是:type=“file”
  2. 上傳文件時,文件起名采用UUID。以防文件覆蓋。

4. 最后:

“在這個最后的篇章中,我要表達我對每一位讀者的感激之情。你們的關注和回復是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮斗。感謝你們,我們總會在某個時刻再次相遇。”

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44759.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C 語言結構體

由于近期項目需求,需使用到大量的指針與結構體&#xff0c;為更好的完成項目&#xff0c;故對結構體與指針的內容進行回顧&#xff0c;同時撰寫本博客&#xff0c;方便后續查閱。 本博客涉及的結構體知識有&#xff1a; 1.0&#xff1a;結構體的創建和使用 2.0: typedef 關…

解鎖音樂密碼,人工智能創作動人歌詞

在音樂的神秘世界里&#xff0c;每一段旋律都像是一把等待開啟的密碼鎖&#xff0c;隱藏著無盡的情感與故事。而如今&#xff0c;人工智能正以其獨特的智慧和創造力&#xff0c;幫助我們解鎖這些音樂密碼&#xff0c;創作出動人的歌詞。 “妙筆生詞智能寫歌詞軟件&#xff08;…

Provider(1)- 什么是AudioBufferProvider

什么是AudioBufferProvider&#xff1f; 顧名思義&#xff0c;Audio音頻數據緩沖提供&#xff0c;就是提供音頻數據的緩沖類&#xff0c;而且這個AudioBufferProvider派生出許多子類&#xff0c;每個子類有不同的用途&#xff0c;至關重要&#xff1b;那它在Android哪個地方使…

訪問 Postman OAuth 2.0 授權的最佳實踐

OAuth 2.0 代表了 web 安全協議的發展&#xff0c;便于在多個平臺上進行授權服務&#xff0c;同時避免暴露用戶憑據。它提供了一種安全的方式&#xff0c;讓用戶可以授權應用程序訪問服務。 在 Postman 中開始使用 OAuth 2.0 Postman 是一個流行的API客戶端&#xff0c;支持 …

亞馬遜店鋪注冊

**步驟一&#xff1a;準備注冊相關資料** 在注冊之前&#xff0c;請準備以下資料&#xff1a; 1.公司營業執照照片&#xff08;清晰完整的拍照上傳&#xff09; 2.法人身份證正反面照片&#xff08;清晰完整的拍照上傳&#xff09; 3.雙幣付款信用卡&#xff08;VISA&#xff0…

[PaddlePaddle飛槳] PaddleSpeech-自動語音識別-小模型部署

PaddleSpeech的GitHub項目地址 環境要求&#xff1a; gcc > 4.8.5 paddlepaddle < 2.5.1 python > 3.8 OS support: Linux(recommend), Windows, Mac OSXpip下載指令&#xff1a; python -m pip install paddlepaddle-gpu2.5.1 -i https://pypi.tuna.tsinghua.edu.c…

探索4D毫米波雷達和攝像頭在自動駕駛中的潛力

隨著自動駕駛技術的快速發展&#xff0c;關于各種傳感器的必要性&#xff0c;尤其是LiDAR&#xff08;激光雷達&#xff09;與毫米波雷達結合攝像頭的作用&#xff0c;激發了激烈的討論。在這篇博客中&#xff0c;我們將探討4D毫米波雷達和攝像頭的組合是否可能成為自動駕駛車輛…

將vue項目整合到springboot項目中并在阿里云上運行

第一步&#xff0c;使用springboot中的thymeleaf模板引擎 導入依賴 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> 在r…

聊聊接入Arbitrum的正確姿勢

本文首發于公眾號&#xff1a;Keegan小鋼 前言 我們知道&#xff0c;目前最主流的 Ethereum Layer2 方案中&#xff0c;主要有 Optimistic Rollup 和 ZK Rollup 兩大類。而 Optimistic Rollup 的實現方案中&#xff0c;則是 Optimism 和 Arbitrum 最受關注。而我們最近接入了 …

Java套紅:指定位置合并文檔-NiceXWPFDocument

需求&#xff1a;做個公文系統&#xff0c;需要將正文文檔在某個節點點擊套紅按鈕&#xff0c;實現文檔套紅 試了很多方法&#xff0c;大多數網上能查到但是實際代碼不能找到關鍵方法&#xff0c;可能是跟包的版本有關系&#xff0c;下面記錄能用的這個。 一&#xff1a;添加依…

redis-cli 連接Redis

Redis-cli介紹 redis-cli 是原生 Redis 自帶的命令行工具&#xff0c;您可以在云主機或本地設備上通過 redis-cli 連接 Redis 數據庫&#xff0c;進行數據管理。 redis-cli 客戶端的使用方法&#xff0c;請參考官方文檔。 連接命令 redis-cli -h <redis_instance_address…

一個極簡的 Vue 示例

https://andi.cn/page/621516.html

【qt】客戶端連接到服務器

獲取到IP地址和端口號. 通過connectToHost() 來進行連接. 對于客戶端來講,只需要socket即可. 客戶端連接服務端只需要使用套接字(Socket)來進行通信。客戶端通過創建一個套接字來連接服務端&#xff0c;然后可以通過套接字發送和接收數據。套接字提供了一種簡單而靈活的方式來…

接口安全配置

問題點&#xff1a; 有員工在工位在某個接口下鏈接一個集線器&#xff0c;從而擴展上網接口&#xff0c;這種行為在某些公司是被禁止的&#xff0c;那么網絡管理員如何控制呢&#xff1f;可以配置接口安全來限制鏈接的數量&#xff0c;切被加入安全的mac地址不會老化&#xff…

JS實現:統計字符出現頻率/計算文字在文本中的出現次數

要實現這個功能&#xff0c;JavaScript 一個非常強大的方法&#xff0c;那就是reduce() reduce() 它用于將數組的所有元素減少到一個單一的值。這個值可以是任何類型&#xff0c;包括但不限于數字、字符串、對象或數組。 reduce() 方法接收一個回調函數作為參數&#xff0c;這個…

win10 docker-compose搭建ELK日志收集

elk的威名大家都知道&#xff0c;以前前司有專門的人維護&#xff0c;現在換了環境&#xff0c;實在不想上服務器看&#xff0c;所以就摸索下自己搭建&#xff0c;由于現場服務器是需要類似向日葵那樣連接&#xff0c;我還是把日志弄回來&#xff0c;自己本地filebeat上傳到es中…

ESP32和ESP8266的WIFI的136個問題與答案

ESP32和ESP8266的WIFI的136個問題與答案 ESP32和ESP8266 WIFI相關問題與答案&#xff0c;具有一定的參考價值。ESP32-S3模塊 1. ESP32 和 ESP8266 是否支持中文 SSID&#xff1f; ESP32 和 ESP8266 均支持中文 SSID&#xff0c;但需要使用相應的庫和設置。需要注意的是&#…

自定義函數---隨機數系列函數

大家有沒有發現平常在寫隨機數的時候&#xff0c;需要引入很多的頭文件&#xff0c;然后還需要用一些復雜的函數&#xff0c;大家可能不太習慣&#xff0c;于是我就制作了一個頭文件 // random_number.h #ifndef RANDOM_NUMBER_H // 預處理指令&#xff0c;防止頭文件被重復包含…

六款領先的電腦監控軟件系統(哪些電腦軟件可以監控電腦)

在當今信息時代&#xff0c;企業對數據安全和員工生產力的關注度越來越高。電腦監控軟件系統成為企業管理的重要工具&#xff0c;幫助企業確保信息安全、提高工作效率。本文將介紹幾款領先的電腦監控軟件系統&#xff0c;以便企業選擇最適合的解決方案。固信電腦監控軟件 可免費…

如何在SQLServer中更改端口

在SQL Server中更改端口通常涉及SQL Server配置管理器的使用&#xff0c;以下是一個詳細的步驟指南&#xff1a; 一、打開SQL Server配置管理器 通過開始菜單&#xff1a;點擊“開始”菜單&#xff0c;搜索“SQL Server配置管理器”并打開它。通過運行窗口&#xff1a;按Win …