javaee實驗:文件上傳及攔截器的使用

目錄

  • 文件上傳
  • @ModelAttribute注解
  • 實驗目的
  • 實驗內容
  • 實驗過程
    • 項目結構
    • 編寫代碼
    • 結果展示

文件上傳

Spring MVC 提供 MultipartFile 接口作為參數來處理文件上傳。
MultipartFile 提供以下方法來獲取上傳的文件信息:
? getOriginalFilename 獲取上傳的文件名字;
? getInputStream 獲取一個 InputStream;
? getSize 上傳文件的大小
? isEmpty 文件上傳內容為空,或者沒有文件上傳
如果上傳單個文件,使用 MultipartFile 類對象接收單個上傳文件,如果是同時上傳多個
文件,則使用 MultipartFile 數組類來接收多個文件。
例 1:單個文件上傳

@PostMapping("/upload/multipart")
@ResponseBody
public Map<String, Object> upload(@RequestParam("photo") MultipartFile
photo)
{
。。。
} 
其中,upload 方法參數類型為 MultipartFile,使用 photo 對象接收單個上傳文件,
@RequestParam("photo")獲取請求參數“photo”值,該變量名稱與視圖表單中的名稱對
應。
<input type="file" name="photo" value="請選擇上傳的文件" />

例 2:批量文件上傳

 @PostMapping("/upload/multipart1")
@ResponseBody
// 使用Spring MVC的MultipartFile類作為參數
public Map<String, Object> upload1(@RequestParam("photo") 
MultipartFile[] photos){。。。}

2
其中,upload1 方法參數類型為 MultipartFile[],即使用數組來接收多個上傳的文
件。這要求 HTTP 請求中包含有多個名字為“photo”的文件。

 <form method="post"action="./multipart1" enctype="multipart/form-data"><input type="file" name="photo" value="請選擇上傳的文件" /><p><input type="file" name="photo" value="請選擇上傳的文件" /><p><input type="file" name="photo" value="請選擇上傳的文件" /><p> <input type="submit" value="提交" /></form>

@ModelAttribute注解

@ModelAttribute 注解主要是將請求參數綁定到 Model 對象上。@ModelAttribute 注解只
有一個 Value 屬性,類型為 String,表示綁定的屬性名稱。當 Controller 類中有任意一個方法
被@ModelAttribute 注解標記,頁面請求只要進入這個控制器,不管請求哪個方法,均會先
執行被@ModelAttribute 標記的方法,所以可以用@ModelAttribute 注解的方法做一些初始化
操作。當同一個 Controller 類中有多個方法被@ModelAttribute 注解標記,所有被
@ModelAttribute 注解標記的方法均會被執行,按先后順序執行,然后再進圖請求的方法。

實驗目的

(1) 掌握 MultipartFile 類的使用
(2) 掌握 Spring MVC 實現文件上傳方法
(3) 掌握@ModelAttribute 注解的使用方法

實驗內容

(1) Spring MVC 框架實現單文件上傳。
(2) Spring MVC 框架實現批量文件上傳。
(3) @ModelAttribute 注解應用

實驗過程

項目結構

在這里插入圖片描述
當然原本uploaded里面是什么都沒有的,這里本來就是存放上傳的文件的地方

編寫代碼

FileController

import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.SimpleFormatter;@Controller
public class FileController {// 定義一個跳轉到上傳頁面的方法,映射到/upload/page路徑@GetMapping("/upload/page")public String uploadPage(){return "/file/upload";}// 定義一個處理文件上傳的方法,映射到/upload/multipart路徑@PostMapping("/upload/multipart")@ResponseBody//使用Spring MVC的MultipartFile數組作為參數,對應了保存的臨時文件public Map<String,Object> upload(@RequestParam("photo")MultipartFile[] photos){String path="D:/idea/code/java/MultipartFile/src/main/resources/uploaded/";//保存路徑// 定義一個計數器,用于記錄上傳成功的文件個數int count = 0;// 遍歷上傳的文件數組for (MultipartFile photo : photos) {// 使用日期格式化類來生成文件名String filename=new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());//獲取上傳文件的后綴suffixString suffix=photo.getOriginalFilename().substring(photo.getOriginalFilename().lastIndexOf("."));// 判斷文件的后綴是否是.jpg,如果不是則跳過這個文件if(!suffix.equals(".jpg")){continue;}try {// 創建一個文件對象,指定保存的位置和文件名File destFile = new File(path + filename + suffix);// 判斷文件的父目錄是否存在,如果不存在則創建if (!destFile.getParentFile().exists()) {destFile.getParentFile().mkdirs();}// 將文件保存到指定的位置photo.transferTo(destFile);// 將計數器加一count++;}catch (IOException e){// 捕獲異常并打印e.printStackTrace();}}// 判斷計數器是否大于零,如果是則表示有文件上傳成功if (count > 0) {// 返回一個成功的提示信息return dealResultMap(true,"上傳成功,共上傳了" + count + "個文件");} else {// 返回一個失敗的提示信息return dealResultMap(false,"上傳失敗,沒有符合條件的文件");}}//處理上傳文件結果private Map<String,Object>dealResultMap(boolean success,String msg){Map<String,Object> result=new HashMap<String,Object>();result.put("success",success);result.put("msg",msg);return result;}}

upload.html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>文件上傳</title>
</head>
<body>
<h1>文件上傳</h1>
<p>請選擇一個.jpg格式的圖片文件,然后點擊上傳按鈕,將文件上傳到服務器。</p>
<form action="/upload/multipart" method="post" enctype="multipart/form-data"><input type="file" name="photo" accept="image/jpeg"><input type="submit" value="上傳">
</form>
<div id="result"></div>
<script>// 獲取表單元素var form = document.querySelector("form");// 獲取結果元素var result = document.getElementById("result");// 監聽表單的提交事件form.addEventListener("submit", function(event) {// 阻止表單的默認提交行為event.preventDefault();// 創建一個FormData對象,用于封裝表單數據var formData = new FormData(form);// 創建一個XMLHttpRequest對象,用于發送異步請求var xhr = new XMLHttpRequest();// 設置請求的方法和地址xhr.open("POST", "/upload/multipart");// 設置請求的響應類型為JSONxhr.responseType = "json";// 設置請求的回調函數xhr.onload = function() {// 判斷請求的狀態是否成功if (xhr.status === 200) {// 獲取響應的數據var data = xhr.response;// 判斷上傳的結果是否成功if (data.success) {// 顯示成功的提示信息result.innerHTML = "<p style='color:green'>" + data.msg + "</p>";} else {// 顯示失敗的提示信息result.innerHTML = "<p style='color:red'>" + data.msg + "</p>";}} else {// 顯示錯誤的提示信息result.innerHTML = "<p style='color:red'>請求失敗,狀態碼:" + xhr.status + "</p>";}};// 發送請求xhr.send(formData);});
</script>
</body>
</html>

MultipartFileApplication

import com.example.multipartfile.controller.FileController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MultipartFileApplication {public static void main(String[] args) {SpringApplication.run(MultipartFileApplication.class, args);}}

結果展示

搜索自己對應的url
在這里插入圖片描述
單擊選擇文件,打開文件夾進行文件的選擇
在這里插入圖片描述
選擇好文件
在這里插入圖片描述
點擊上傳
在這里插入圖片描述
返回idea中查看
在這里插入圖片描述
在選擇的保存路徑uploaded中出現了我們選擇上傳的圖片,當然也可以選擇多文件上傳,只要同時選擇多個文件,然后點擊上傳就可以了

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

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

相關文章

華為OD機試真題-測試用例執行計劃-2023年OD統一考試(C卷)

題目描述: 某個產品當前迭代周期內有N個特性( F1,F2,.......FN)需要進行覆蓋測試,每個特性都被評估了對應的優先級,特性使用其ID作為下標進行標識。 設計了M個測試用例(T1,T2......,TM ),每個用例對應了一個覆蓋特性的集合,測試用例使用其ID作為下標進行標識,測試用例…

特權FPGA學習筆記

C/C/system C-----vivado HLS------------->RTL門電路&#xff0c;省去了HDL語言的中間轉換&#xff0c;可以看作是C向C#的演進&#xff0c;基于zynq面向以前使用C的開發人員&#xff0c;但是個人覺得&#xff0c;HDL存在且未被C取代&#xff0c;工具的著眼點就是面向底層調…

Spring Cloud 與微服務學習總結(19)—— Spring Cloud Alibaba 之 Nacos 2.3.0 史上最大更新版本發布

Nacos 一個用于構建云原生應用的動態服務發現、配置管理和服務管理平臺,由阿里巴巴開源,致力于發現、配置和管理微服務。說白了,Nacos 就是充當微服務中的的注冊中心和配置中心。 Nacos 2.3.0 新特性 1. 反脆弱插件 Nacos 2.2.0 版本開始加入反脆弱插件,從 2.3.0 版本開…

飛天使-linux操作的一些技巧與知識點2

TCP 的三次握手 第一次&#xff0c;客戶端與服務端建立鏈接&#xff0c;需要發送請求連接的消息 第二次&#xff0c;服務端接口到數據后&#xff0c;返回一個確認的操作*&#xff08;至此客戶端和服務端鏈路建立成功&#xff09; 第三次&#xff0c;服務端還需要發送要與客戶端…

【Linux】探索Linux進程狀態 | 僵尸進程 | 孤兒進程

最近&#xff0c;我發現了一個超級強大的人工智能學習網站。它以通俗易懂的方式呈現復雜的概念&#xff0c;而且內容風趣幽默。我覺得它對大家可能會有所幫助&#xff0c;所以我在此分享。點擊這里跳轉到網站。 目錄 一、進程狀態1.1運行狀態1.2阻塞狀態1.3掛起狀態 二、具體L…

React中使用react-json-view展示JSON數據

文章目錄 一、前言1.1、在線demo1.2、Github倉庫 二、實踐2.1、安裝react-json-view2.2、組件封裝2.3、效果2.4、參數詳解2.4.1、src(必須) &#xff1a;JSON Object2.4.2、name&#xff1a;string或false2.4.3、theme&#xff1a;string2.4.4、style&#xff1a;object2.4.5、…

[ROS2] --- service

1 service介紹 1.1 service概念 話題通信是基于訂閱/發布機制的&#xff0c;無論有沒有訂閱者&#xff0c;發布者都會周期發布數據&#xff0c;這種模式適合持續數據的收發&#xff0c;比如傳感器數據。機器人系統中還有另外一些配置性質的數據&#xff0c;并不需要周期處理&…

C#,圖算法——以鄰接節點表示的圖最短路徑的迪杰斯特拉(Dijkstra)算法C#程序

1 文本格式 using System; using System.Text; using System.Linq; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer.Algorithm { public class Node // : IComparable<Node> { private int vertex, weigh…

第7章-使用統計方法進行變量有效性測試-7.5.4-模型評估

目錄 混淆矩陣 準確率 定義 局限性 精準率 定義 局限性

【分布式微服務專題】從單體到分布式(一、SpringCloud項目初步升級)

目錄 前言閱讀對象閱讀導航前置知識筆記正文一、單體服務介紹二、服務拆分三、分布式微服務升級前的思考3.1 關于SpringBoot/SpringCloud的思考【有點門檻】 四、SpringCloud升級整合4.1 新建父子項目 學習總結感謝 前言 從本節課開始&#xff0c;我將自己手寫一個基于SpringC…

如何輕松恢復 Windows 中刪除的文件夾

我們都曾經歷過這樣的事&#xff0c;而且我們中的大多數人可能很快就會再次這樣做。我們討論的是在 Windows 中按“Delete”或“ShiftDelete”鍵意外刪除重要文件夾的情況。 如果您剛剛按下刪除鍵且未超過 30 天&#xff0c;或者尚未清空回收站&#xff0c;則可以恢復文件夾。…

操作系統學習筆記---內存管理

目錄 概念 功能 內存空間的分配和回收 地址轉換 邏輯地址&#xff08;相對地址&#xff09; 物理地址&#xff08;絕對地址&#xff09; 內存空間的擴充 內存共享 存儲保護 方式 源程序變為可執行程序步驟 鏈接方式 裝入方式 覆蓋 交換 連續分配管理方式 單一連…

python安裝與工具PyCharm

摘要&#xff1a; 周末閑來無事學習一下python&#xff01;不是你菜雞&#xff0c;只不過是對手太強了&#xff01;所以你要不斷努力&#xff0c;去追求更高的未來&#xff01;下面先了解python與環境的安裝與工具的配置&#xff01; python安裝&#xff1a; 官網 進入官網下載…

lua腳本串口收發與CRC16校驗及使用方法

lua腳本CRC16校驗 --calculate CRC16校驗 --data : t, data to be verified --n : number of verified --return : check result function add_crc16(start, n, data)local carry_flag, a 0local result 0xfffflocal i startwhile(true)doresult result ~ data[i]for j…

git 關于分支、merge、commit提交

最近開始用git終端提交代碼&#xff0c;梳理了一些知識點 一 關于分支 關于分支&#xff0c;git的分支分為本地分支遠程分支兩種分支&#xff0c;在上傳代碼時&#xff0c;我們要確保當前本地分支連接了一個遠程分支。 我們可以通過下面代碼查看當前的本地分支&#xff1a; g…

迅為3588開發板 sudo: 無法解析主機:/DNS配置

環境申明 RK3588 ubuntu 22.04 jammy 迅為開發板 hostname 看是否有Host .&#xff0c;如果沒有&#xff0c; sudo vim /etc/hostname在里面加一行&#xff0c;我這就這一個 iTOP-RK3588hosts 修改本地hosts sudo vim /etc/hosts127.0.0.1 localhost localhost iTOP-RK3…

2.postman環境變量及接口關聯

一、環境變量以及全局變量 操作流程 1.點擊environment 2.點擊environment右側號&#xff0c;新增環境變量 3.在變量中輸入變量名以及變量值 4.回到collection頁面&#xff0c;修改變量環境 5.在collection中通過{{變量名}}調用變量 變量定義 環境變量&#xff1a;環境變量…

vue 限制在指定容器內可拖拽的div

<template><div class"container" id"container"><div class"drag-box center" v-drag v-if"isShowDrag"><div>無法拖拽出容器的div浮窗</div></div></div> </template><script&g…

P11 Linux進程編程exec族函數

前言 &#x1f3ac; 個人主頁&#xff1a;ChenPi &#x1f43b;推薦專欄1: 《Linux C應用編程&#xff08;概念類&#xff09;_ChenPi的博客-CSDN博客》??? &#x1f525; 推薦專欄2: 《C_ChenPi的博客-CSDN博客》??? &#x1f6f8;推薦專欄3: ??????《鏈表_C…

Java 簡易版 UDP 多人聊天室

服務端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…