Spring MVC(五) 文件上傳

1 單文件上傳

????????在程序開發中,有時候需要上傳一些文件。我們在學習Servlet的時候,也做過文件上傳的操作,只不過基于Servlet的文件上傳操作起來過于復雜,因此所有的MVC框架都提供了自己的文件上傳操作,基本上都是基于FileUpload的文件上傳。

????????Spring MVC在處理文件上傳的時候,有自己的處理方法,但是也是基于FileUpload的操作,因此在處理文件上傳的時候也需要導入commons-fileupload-1.2.2.jar包和commons-io-2.4.jar包。

????????在操作的時候,首先需要在配置文件中,配置Spring MVC文件上傳功能,具體代碼如下。

<!-- 設置了multipartResolver才能完成文件上傳 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 文件上傳字符編碼 --><property name="defaultEncoding" value="UTF-8"></property><!-- 設置文件上傳的大小,單位是字節 --><property name="maxUploadSize" value="2000000"></property>
</bean>

????????接下來需要一個表單,用來執行選擇文件操作,首先在控制器中添加方法,用來跳轉到文件上傳頁面,具體代碼如下。

@RequestMapping(value="/uploadInput", method=RequestMethod.GET)
public String upload() {return "upload";
}

????????在WEB-INF/jsp目錄下創建upload.jsp頁面,并添加如下代碼。

<form action="upload" method="post" enctype="multipart/form-data">name:<input type="text" name="name"><br>file:<input type="file" name="fileName"><br><input type="submit" value="提交">
</form>

????????頁面效果如圖所示。

????????在控制器中只需要在處理方法中加入參數MultipartFile,就可以實現文件上傳了。編寫處理方法,代碼內容如下。

@RequestMapping(value="/upload", method=RequestMethod.POST)
public String upload(String name, MultipartFile file, HttpServletRequest req) {System.out.println(name);//獲取表單域的名字System.out.println(file.getName());//獲取文件原始的名字System.out.println(file.getOriginalFilename());//獲取文件的類型System.out.println(file.getContentType());//獲取文件上傳的路徑String realpath = req.getSession().getServletContext().getRealPath("/upload");//創建文件對象File f = new File(realpath + "/" + file.getOriginalFilename());try {//文件上傳
FileUtils.copyInputStreamToFile(file.getInputStream(), f);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return "upload";
}

????????注意:方法中MultipartFile對象的名字,必須和文件表單域的名字一致,否則會報錯。

????????在WebRoot目錄下創建文件夾upload,訪問:http://localhost:8080/springmvc/uploadInput,選擇文件,就可以正常上傳文件了。

2?多文件上傳

????????在實際的開發中,有時要同時上傳多個文件,在處理的時候,只需要稍作修改就可以了。首先需要修改文件上傳頁面代碼,如下所示。

<form action="upload" method="post" enctype="multipart/form-data">name:<input type="text" name="name" size="30"><br><br>file:<input type="file" name="files"><br><br>file:<input type="file" name="files"><br><br>file:<input type="file" name="files"><br><br><input type="submit" value="提交">
</form>

????????頁面顯示的效果如圖所示。

????????在控制器中的處理也非常簡單,只需要把對象改為一個數組即可,代碼修改如下。

@RequestMapping(value="/upload", method=RequestMethod.POST)
public String upload(String name, MultipartFile files[], HttpServletRequest req) {//獲取文件上傳的路徑String realpath = req.getSession().getServletContext().getRealPath("/upload");for(MultipartFile file:files) {//在多文件上傳時,防止有的文件表單域沒有選擇文件if(file.isEmpty()) {continue;}//創建文件對象File f = new File(realpath + "/" + file.getOriginalFilename());try {//文件上傳	 FileUtils.copyInputStreamToFile(file.getInputStream(), f);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return "success";
}

????????此時選擇多個文件,也能同時完成上傳,即使有的表單域沒有選擇文件,也是可以的,同時這種方法同樣也能完成單文件的上傳。不過這樣做也有點費事,在實際開發中往往都是通過插件,使在一個選擇框中,可以同時選擇若干文件,實現同時上傳。這一點在HTML5中,可以通過multiple屬性來實現在一個文件表單域中可接受多個值的文件上傳,在HTML4中仍然可以使用,具體代碼如下所示。

<form action="upload" method="post" enctype="multipart/form-data">name:<input type="text" name="name" size="30"><br><br>file:<input type="file" name="files" multiple="multiple"><br><br><input type="submit" value="提交">
</form>

????????頁面效果如圖所示。

????????后臺接收文件的處理代碼不用修改,可以直接使用。

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

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

相關文章

UE5 FARFilter篩選器使用方法

UE5 查找資源時可以用FARFilter進行篩選&#xff0c;之前可以用ClassNames進行篩選&#xff0c;但是5.1之后就棄用這個屬性改成ClassPaths屬性 構造一個FTopLevelAssetPath對象需要兩個FName參數&#xff0c;但是沒找到應該傳什么 查找官方文檔&#xff0c;明顯是錯誤的&#x…

AAAI: Generalized Singular Value Thresholding論文閱讀

1 Abstract 這篇論文研究了與非凸函數g相關的廣義奇異值閾值(Generalized Singular Value Thresholding, GSVT)算子Proxσ g ()&#xff0c;定義為 P r o x g σ ( B ) arg ? min ? X ∑ i 1 m g ( σ i ( X ) ) 1 2 ∥ X ? B ∥ F 2 , \mathbf{Prox}_{g}^{\sigma}(\mat…

Python學習-Numpy-1

學習參考鏈接&#xff1a; Numpy的介紹和安裝和性能對比_嗶哩嗶哩_bilibili Numpy相對List的優勢和特點 1、Numpy的數據結構是array數組 2、相較List的性能更好&#xff0c;并且包含大量的便捷的函數&#xff0c;以及數組中元數據的信息 3、array的數據類型必須一致&#xff0c…

實驗名稱:TCP 連接管理

目錄 實驗目的&#xff1a; 實驗原理&#xff1a; 實驗步驟&#xff1a; 1) 啟動WireShark&#xff0c;設置抓包狀態 2) 訪問指定服務器 &#xff0c;通過Wireshark抓取通信數據報文 3) 分析TCP連接建立的三次握手和連接釋放的四次握手過程 原始數據記錄&#xff1a; 實…

微信小程序生命周期揭秘:從啟動到消亡的全過程剖析【附代碼】

微信小程序生命周期揭秘&#xff1a;從啟動到消亡的全過程剖析 一、小程序生命周期概覽核心生命周期函數 二、深入理解生命周期回調2.1 onLoad: 首次亮相的準備2.2 onShow: 重登舞臺的瞬間2.3 onReady: 舞臺就緒&#xff0c;靜待表演2.4 onHide & onUnload: 謹慎離場&#…

【數據結構陳越版筆記】第1章 概述【習題】

1. 碎碎念 我這答案做的可能不對&#xff0c;如果不對&#xff0c;歡迎大家指出錯誤 2. 答案 1.1 判斷正誤 &#xff08;1&#xff09; N ( log N ) 2 N(\text{log}N)^{2} N(logN)2是 O ( N 2 ) O(N^{2}) O(N2)的。 &#xff08;2&#xff09; N 2 ( log N ) 2 N^{2}(\text…

藍橋杯備戰12.階乘

P5739 【深基7.例7】計算階乘 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 遞歸 #include<bits/stdc.h> #define endl \n #define int long long using namespace std; const int N 2e710,M 1e310; double a[N]; int jie(int n) {if(n1)return 1;else return n*ji…

HTML/CSS3

1.CSS CSS的作用在于在HTML的基礎上(決定網頁的內容和結構)對網頁進行排版布局 對網頁中的元素提供樣式 使得網頁顯得更加精美CSS全稱是cascading style sheets 即層疊樣式表CSS樣式的書寫格式&#xff1a;樣式名: 樣式值 例如&#xff1a;color: red建議:之后進行空格 CSS樣式…

AXI Interconnect IP核的連接模式簡介

AXI Interconnect IP核內部包含一個 Crossbar IP核&#xff0c;用于在 Slave Interfaces&#xff08;SI&#xff09;和 Master Interfaces&#xff08;MI&#xff09;之間路由傳輸。在連接 SI 或 MI 到 Crossbar 的每條路徑上&#xff0c;可以選擇性地添加一系列 AXI Infrastru…

2024年安全員C證報名條件

安全員c證&#xff0c;又稱建筑施工企業三類人員c證&#xff0c;持證者一般是建筑施工企業專職安全生產管理的專業人員。安全員c證報名條件是: 1、職業道德良好&#xff0c;身體健康&#xff0c;年齡不超過60周歲(法定代表人除外); 2、具有中專及以上文化程度或初級及以上技術…

WMS系統批次管理概述

為了提高倉庫運作效率&#xff0c;降低庫存成本&#xff0c;越來越多的企業開始引入WMS倉庫管理系統&#xff0c;WMS系統批次管理作為其核心功能之一&#xff0c;對于實現精細化、智能化的倉儲管理具有重要意義。 二、WMS系統批次管理概述 WMS系統批次管理是指通過對倉庫中的貨…

rust調用SQLite實例

rusqlite庫介紹 Rusqlite是一個用Rust編寫的SQLite庫&#xff0c;它提供了對SQLite數據庫的操作功能。Rusqlite的設計目標是提供一個簡潔易用的API&#xff0c;以便于Rust程序員能夠方便地訪問和操作SQLite數據庫。 Rusqlite的主要特點包括&#xff1a; 遵循Rust的類型系統和…

SQL_hive的連續開窗函數

SQL三種排序&#xff08;開窗&#xff09;第幾名/前幾名/topN 1三種排序&#xff08;開窗&#xff09;第幾名/前幾名/topN思路 4種排序開窗函數 1三種排序&#xff08;開窗&#xff09;第幾名/前幾名/topN 求每個學生成績第二高的科目-排序思路 t2表&#xff1a;對每個學生 的…

基于Python的web漏洞挖掘掃描技術的實現與研究【附源碼,文檔】

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

Vue3 項目

創建 Vue3 項目的步驟如下&#xff1a; 安裝 Node.js Vue3 需要依賴 Node.js 環境&#xff0c;因此需要先安裝 Node.js。可以從官網下載 Node.js 的安裝包并安裝&#xff0c;也可以使用包管理器安裝&#xff0c;例如在 Ubuntu 上可以使用以下命令安裝&#xff1a; sudo apt-get…

C語言筆記13

字符數組與字符串常量區別 #include <stdio.h> int main() {char str1[] "hello bit.";char str2[] "hello bit.";char *str3 "hello bit.";char *str4 "hello bit.";if(str1 str2)printf("str1 and str2 are same\n…

【生信技能樹】拿到表達矩陣之后,如何使用ggplot2繪圖系統繪制箱線圖?

拿到表達矩陣之后&#xff0c;如何使用ggplot2繪圖系統繪制箱線圖&#xff1f; 目錄 預備知識 繪制箱線圖示例 預備知識 1.pivot_longer函數 pivot_longer 是tidyr包中的一個函數&#xff0c;用于將數據框&#xff08;data frame&#xff09;從寬格式轉換為長格式。在寬格…

一文掌握gRPC

文章目錄 1. gRPC簡介2. Http2.0協議3. 序列化-Protobuf4. gRPC開發實戰環境搭建5. gRPC的四種通信方式&#xff08;重點&#xff09;6. gRPC的代理方式7. SprintBoot整合gRPC 1. gRPC簡介 gRPC是由google開源的高性能的RPC框架。它是由google的Stubby這樣一個內部的RPC框架演…

reactJs動態執行js代碼

參考了這篇文章 js——new Function 一個可以隨時動態執行字符串js代碼的神器 因為一些原因&#xff0c;想要js代碼塊配置在數據庫中返回&#xff0c;例如時間&#xff0c;我需要用到第三方庫 moment。然后動態的得到startDate 和 endDate 配置在數據庫中的startDate值是$mom…

Java日志總結

開發中&#xff0c;日志記錄是不可或缺的一部分&#xff0c;應用日志的記錄主要用于&#xff1a;記錄操作軌跡數據、監控系統運行情況、系統故障定位問題&#xff0c;日志的重要性不言而喻&#xff0c;想要快速定位問題&#xff0c;日志分析是個重要的手段&#xff0c;Java也提…