day12-SpringMVC文件上傳

来源:https://www.cnblogs.com/liyuelian/archive/2023/02/17/17131740.html
-Advertisement-
Play Games

SpringMVC文件上傳 1.基本介紹 SpringMVC 為文件上傳提供了直接的支持,這種支持是通過即插即用的 MultipartResolver 實現的。spring 用 Jacarta Commons FileUpload 技術實現了一個 MultipartResolver 的實現類:Com ...


SpringMVC文件上傳

1.基本介紹

  1. SpringMVC 為文件上傳提供了直接的支持,這種支持是通過即插即用的 MultipartResolver 實現的。spring 用 Jacarta Commons FileUpload 技術實現了一個 MultipartResolver 的實現類:CommonsMultipartResovler

  2. SpringMVC 上下文預設沒有裝配 MultipartResolver ,因此預設情況下不能處理文件的上傳工作。如果要使用 Spring 文件上傳功能,要先在上下文(容器文件)中配置 MultipartResolver

    <!--配置文件上傳解析器-->
    <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" 
          id="multipartResolver">
    </bean>
    

2.應用實例

(1)引入 SpringMVC 文件上傳需要的 jar 包

image-20230217200556207

(2)創建 fileUpload.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上傳</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/fileUpload"
      method="post" enctype="multipart/form-data">
    文件介紹:<input type="text" name="introduce"/><br/>
    選擇文件:<input type="file" name="file"/><br/>
    <input type="submit" value="上傳文件"/>
</form>
</body>
</html>

(3)web.xml 文件中配置過濾器,處理中文亂碼問題(這裡使用 spring 提供的過濾器)

<!--使用spring提供的過濾器處理中文-->
<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>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

(4)MyCharacterFilter.java

package com.li.web.filter;

import javax.servlet.*;
import java.io.IOException;

/**
 * @author 李
 * @version 1.0
 * 編寫過濾器處理中文亂碼問題
 */
public class MyCharacterFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest servletRequest, 
                         ServletResponse servletResponse, 
                         FilterChain filterChain) throws IOException, ServletException {
        //加入對編碼的處理
        servletRequest.setCharacterEncoding("utf-8");
        //放行請求
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {}
}

(5)在 spring 的容器文件中,配置文件上傳解析器

<!--配置文件上傳解析器-->
<!--這裡是按照介面名字獲取bean,因此 id要寫為 multipartResolver(介面)-->
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
      id="multipartResolver">
</bean>

(6)創建 FileUploadHandler.java

package com.li.web.fileupload;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;

/**
 * @author 李
 * @version 1.0
 * 處理文件上傳的 handler
 */
@Controller
public class FileUploadHandler {
    //編寫方法,處理文件上傳的請求
    @RequestMapping(value = "/fileUpload")
    public String fileUpload(@RequestParam(value = "file") MultipartFile multipartFile,
                             HttpServletRequest request, String introduce) 
        throws IOException {
        //接收到提交的文件名
        String originalFilename = multipartFile.getOriginalFilename();
        System.out.println("你上傳的文件介紹=" + introduce);
        System.out.println("你上傳的文件名=" + originalFilename);
        //得到上傳的文件要保存的路徑[全路徑:包括文件名]
        //這裡其實是out目錄下的路徑
        String fileFullPath =
                request.getServletContext().getRealPath("/img/" + originalFilename);
        //創建文件
        File saveToFile = new File(fileFullPath);
        //將上傳文件轉存到 saveToFile
        multipartFile.transferTo(saveToFile);
        return "success";
    }
}

(7)啟動 tomcat,訪問 fileUpload.jsp,選擇文件上傳

image-20230217204739917

後臺輸出:

image-20230217205540158

上傳的文件:

這裡只是模擬,真正開發中不會將文件存放在項目目錄中,而是存放在主機的另外的磁碟上,每次存放文件時會將存放路徑保存到資料庫中。下載文件時會讀取資料庫數據,得到路徑,尋找文件。

image-20230217204906903

postman 也可以進行文件上傳:

image-20230217220956037

3.transferTO()方法

@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
    //首先判斷該文件(路徑)在磁碟中是不是可獲取的
   if (!isAvailable()) {
      throw new IllegalStateException("File has already been moved - cannot be transferred again");
   }

    //判斷上傳的文件在磁碟中存不存在,如果存在就會去嘗試刪除該文件,如果刪除失敗,就會拋出異常
   if (dest.exists() && !dest.delete()) {
      throw new IOException(
            "Destination file [" + dest.getAbsolutePath() + "] already exists and could not be deleted");
   }

    //如果文件不存在,或者存在但刪除成功了
   try {
       //將上傳的文件拷貝到目標目錄 dest 下
       //this.fileItem 就是你要上傳文件的臨時文件(tmp文件)
       //就是說 SpringMVC 上傳文件也是先將上傳文件保存為臨時文件,然後再拷貝為目標文件
      this.fileItem.write(dest);
      LogFormatUtils.traceDebug(logger, traceOn -> {
         String action = "transferred";
         if (!this.fileItem.isInMemory()) {
            action = (isAvailable() ? "copied" : "moved");
         }
         return "Part '" + getName() + "',  filename '" + getOriginalFilename() + "'" +
               (traceOn ? ", stored " + getStorageDescription() : "") +
               ": " + action + " to [" + dest.getAbsolutePath() + "]";
      });
   }
   catch (FileUploadException ex) {
      throw new IllegalStateException(ex.getMessage(), ex);
   }
   catch (IllegalStateException | IOException ex) {
      // Pass through IllegalStateException when coming from FileItem directly,
      // or propagate an exception from I/O operations within FileItem.write
      throw ex;
   }
   catch (Exception ex) {
      throw new IOException("File transfer failed", ex);
   }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如有需要請下載leader_line.js文件https://pan.baidu.com/s/1zNJhiGsH32hNpTwAEsyQaQ?pwd=1997 <template> <div style="height:100%;overflow: hidden;width:100%" v-load ...
  • 創建前端項目 npm install create-react-app -g create-react-app my-app-client create-react-app 是創建單頁面程式的腳手架 前端目錄結構 創建好項目之後,刪掉 src 目錄下的文件,按照以下結構創建目錄,根據具體項目情況進行 ...
  • 前言:用於展示生產線數據相關信息 在車輛生產線的小屏幕上【西門子的,比1980*1080的要小一圈,比pad要大一圈,專門給生產線做的】展示數據。數據用的flex佈局,很簡單的解決了自適應的問題。效果很好。 但,image展示的圖片的寬高不勻稱,比例不同。 這是開始的代碼,只摘取了關鍵部分: <bo ...
  • defineExpose要在變數和方法聲明定義之後再使用,否則瀏覽器的控制台會輸出很多警告,並且最終將該頁面卡死。 ...
  • 今天,有個群友在群里提問,使用 CSS 能否實現下述這個圖形: emmm,中間這個酷似三次貝塞爾曲線的造型,使用 CSS 不太好實現。我的建議是切圖實現,然而群友要求一定要用 CSS 實現。 雖然麻煩,但是這個圖形勉強也是能用 CSS 實現的。本文就將探討一下上述圖形的純 CSS 實現方式,並且從中 ...
  • 在分散式系統中, 什麼是拜占庭將軍問題?產生的場景和解決方案是什麼?什麼是 Raft 共識演算法?Raft 演算法是如何解決拜占庭將軍問題的?其核心原理和演算法邏輯是什麼?除了 Raft,還有哪些共識演算法?共識問題作為分散式系統的一大難點和痛點,本文主要介紹了其產生的背景、原因,以及通用的 Raft 演算法... ...
  • 談到java中的併發,我們就避不開線程之間的同步和協作問題,談到線程同步和協作我們就不能不談談jdk中提供的AbstractQueuedSynchronizer(翻譯過來就是抽象的隊列同步器)機制; (一)、AQS中的state和Node含義: AQS中提供了一個int volatile state ...
  • 題目來源:https://www.acwing.com/problem/content/description/789/ 題目描述 給定你一個長度為 n 的整數數列。 請你使用歸併排序對這個數列按照從小到大進行排序。 並將排好序的數列按順序輸出。 輸入格式 輸入共兩行,第一行包含整數 n。 第二行包 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...