SpringMVC 通過ajax 實現文件的上傳

使用form表單在springmvc 項目中上傳文件,文件上傳成功之后往往會跳轉到其他的頁面。但是有的時候,文件上傳成功的同時,并不需要進行頁面的跳轉,可以通過ajax來實現文件的上傳

下面我們來看看如何來實現:

方式1:前臺從dom對象中獲取到文件,并且將文件解析為Blob ,我們來看看頁面代碼:

<input type="file" class="inputPic" />

? javascript代碼:

$(".inputPic").change(function() {var serviceUrl = "http://localhost:8070/file/";var url = serviceUrl + "/upload_aj";var form = new FormData();var file=$(".inputPic")[0].files;console.log(file[0].name)form.append("myfile", new Blob(file));form.append("filename", file[0].name);var xhr = new XMLHttpRequest(); xhr.open("post", url, true); // poxhr.upload.onloadstart = function() {// 上傳開始執行方法ot = new Date().getTime(); // 設置上傳開始時間oloaded = 0;// 設置上傳開始時,以上傳的文件大小為0};xhr.send(form); // 開始上傳,發送form數據xhr.responseText = function(res) {console.log(res);}xhr.onreadystatechange = function(response) {console.log(response);if (response.target.readyState == '4') {var result = JSON.parse(response.target.response);console.log(result)if (Number(result.data) == 0) {alert(result.msg);} else {alert("圖片上傳成功");}}}});</script>

后臺:

	@ResponseBody@RequestMapping(value = "upload_aj", method = RequestMethod.POST)public Map<String, Object> upload_aj(HttpServletRequest request, @RequestParam("myfile") MultipartFile file) {try {String filename=request.getParameter("filename");byte[] bytes = file.getBytes();System.out.println(filename);Path path = Paths.get("保存路徑/"+filename);Files.write(path, bytes);} catch (Exception e) {e.printStackTrace();}Map<String, Object> map = new HashMap<>();map.put("msg", "文件上傳成功");map.put("code", "0000");return map;}

方式2:前端將文件轉換為base64,然后上傳到后臺:

前端代碼:

	<input type="file" class="inputPic" />

javascript代碼:

	$(".inputPic").change(function() {var serviceUrl = "http://localhost:8070/file/";var url = serviceUrl + "/upload_aj";var form = new FormData();var file=$(".inputPic")[0].files;console.log(file[0].name)form.append("myfile", new Blob(file));form.append("filename", file[0].name);var xhr = new XMLHttpRequest(); xhr.open("post", url, true); // poxhr.upload.onloadstart = function() {// 上傳開始執行方法ot = new Date().getTime(); // 設置上傳開始時間oloaded = 0;// 設置上傳開始時,以上傳的文件大小為0};xhr.send(form); // 開始上傳,發送form數據xhr.responseText = function(res) {console.log(res);}xhr.onreadystatechange = function(response) {console.log(response);if (response.target.readyState == '4') {var result = JSON.parse(response.target.response);console.log(result)if (Number(result.data) == 0) {alert(result.msg);} else {alert("圖片上傳成功");}}}});

后端代碼:

	@ResponseBody@RequestMapping(value = "upload_base", method = RequestMethod.POST)public Map<String, Object> upload_base(@RequestBody Map<String,Object> reqMap){try {String filename=reqMap.get("filename")+"";String filestr=reqMap.get("filestr")+"";System.out.println(filestr);	Base64FileConverter.decodeBase64ToFile(filestr,"C:\\upload/"+filename);} catch (Exception e) {e.printStackTrace();}Map<String, Object> map = new HashMap<>();map.put("msg", "文件上傳成功");map.put("code", "0000");return map;}

?工具類:

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;public class Base64FileConverter {/*** 將 Base64 字符串解碼并寫入文件* @param base64String 包含文件數據的 Base64 字符串* @param outputFilePath 輸出文件的路徑* @throws IOException 如果文件操作出錯*/public static void decodeBase64ToFile(String base64String, String outputFilePath) throws IOException {// 檢查 Base64 字符串是否包含 MIME 類型前綴(如 data:image/jpeg;base64,)String pureBase64 = base64String;int commaIndex = base64String.indexOf(',');if (commaIndex > 0) {pureBase64 = base64String.substring(commaIndex + 1);}// 解碼 Base64 字符串byte[] fileData = Base64.getDecoder().decode(pureBase64);// 寫入文件try (FileOutputStream fos = new FileOutputStream(outputFilePath)) {fos.write(fileData);System.out.println("文件已成功寫入: " + outputFilePath);}}/*** 將文件編碼為 Base64 字符串* @param filePath 文件路徑* @return 文件的 Base64 編碼字符串* @throws IOException 如果文件操作出錯*/public static String encodeFileToBase64(String filePath) throws IOException {byte[] fileData = Files.readAllBytes(Paths.get(filePath));return Base64.getEncoder().encodeToString(fileData);}}

上面就是對文件上傳的通過ajax來實現的步驟,希望對你有所幫助

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

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

相關文章

Docker安裝Fluentd采集中間件

Fluentd 簡介 &#xff1a;Fluentd 是一個高性能、可擴展的數據收集與聚合工具&#xff0c;能夠統一數據收集和消費&#xff0c;實現各種數據源到各種數據接收器的高效傳輸&#xff0c;廣泛應用于日志收集等領域。 功能特點 &#xff1a; 統一日志收集 &#xff1a;支持從各種…

07SpringMVC底層形象解析

目錄 一、基于餐廳比喻的代碼示例 &#xff0c;幫助你理解各組件間的協作關系 1. DispatcherServlet 配置&#xff08;服務員&#xff09; 2. HandlerMapping 配置&#xff08;菜單索引&#xff09; 3. Controller 實現&#xff08;廚師&#xff09; 4. Service 層&#x…

eclipse 生成函數說明注釋

在Eclipse中生成函數說明注釋&#xff08;JavaDoc風格&#xff09;可以通過以下方法實現&#xff1a; 快捷鍵方式&#xff1a; 將光標放在函數上方輸入/**后按回車鍵Eclipse會自動生成包含參數和返回值的注釋模板 菜單方式&#xff1a; 選中函數點擊菜單欄 Source > Gen…

【題解-洛谷】P6180 [USACO15DEC] Breed Counting S

題目:P6180 [USACO15DEC] Breed Counting S 題目描述 Farmer John 的 N N N 頭奶牛,從左到右編號為 1 …

基于Android的XX校園交流APP

開發語言&#xff1a;Java框架&#xff1a;ssmAndroidJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat12開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系統展示 APP登錄 APP首頁…

25、工業防火墻 - 工控網絡保護 (模擬) - /安全與維護組件/industrial-firewall-dcs-protection

76個工業組件庫示例匯總 工業防火墻 - 工控網絡保護 (模擬) 概述 這是一個交互式的 Web 組件,旨在模擬工業防火墻在保護關鍵工控網絡(特別是 DCS - 分布式控制系統)免受網絡攻擊(如勒索軟件傳播)方面的核心功能。組件通過可視化簡化的網絡拓撲、模擬網絡流量、應用防火…

kotlin flow的兩種SharingStarted策略的區別

一 兩種 SharingStarted 策略的區別&#xff1a; SharingStarted.Eagerly: 立即開始收集上游流&#xff0c;即使沒有下游訂閱者持續保持活躍狀態&#xff0c;直到 ViewModel 被清除優點&#xff1a;響應更快&#xff0c;數據始終保持最新缺點&#xff1a;消耗更多資源&#x…

Windows_RustRover Rust語言開發環境構建

Windows_RustRover Rust語言開發環境構建 一、Rust語言簡介&#xff08;一&#xff09;起源與發展&#xff08;二&#xff09;語言特點&#xff08;三&#xff09;應用場景&#xff08;四&#xff09;社區與生態 二、RustRover&#xff08;一&#xff09;主要功能&#xff08;二…

XCOSnTh-fatfsShell

#include "XCOSnTh.h" #include "ff.h" #include "stdio.h" static char pwd[1024]"1:"; static char pwdCount2; FRESULT lsExe(char *path,int(*printf)(const char* format, ...)) {FRESULT res;DIR dir;FILINFO fno;// 打開根目錄…

篇章十 消息持久化(二)

目錄 1.消息持久化-創建MessageFileManger類 1.1 創建一個類 1.2 創建關于路徑的方法 1.3 定義內部類 1.4 實現消息統計文件讀寫 1.5 實現創建消息目錄和文件 1.6 實現刪除消息目錄和文件 1.7 實現消息序列化 1. 消息序列化的一些概念&#xff1a; 2. 方案選擇&#xf…

中間件-seata

分布式事務seata 角色組成角色指責AT模式TCC模式 角色組成 TC&#xff1a;事務協調者&#xff0c;維護全局和分支事務的狀態&#xff0c;驅動全局事務提交或回滾。TM&#xff1a;事務管理者&#xff0c;定義全局事務的范圍&#xff1a;開始全局事務、提交或回滾全局事務。RM&am…

python代碼繪制某只股票最近90天的K線圖、均線、量能圖

運行代碼&#xff0c;要求輸入股票代碼和名稱&#xff0c;其他參數可省略 import akshare as ak import matplotlib.pyplot as plt import pandas as pd import mplfinance as mpf import matplotlib.dates as mdates import numpy as np import os from datetime import date…

Xilinx 7Series\UltraScale 在線升級FLASH STARTUPE2和STARTUPE3使用

一、FPGA 在線升級 FPGA 在線升級FLASH時&#xff0c;一般是通過邏輯生成SPI接口操作FLASH&#xff0c;當然也可以通過其他SOC經FPGA操作FLASH&#xff0c;那么FPGA就要實現在啟動后對FLASH的控制。 對于7Series FPGA&#xff0c;只有CCLK是專用引腳&#xff0c;SPI接口均為普…

Azure 應用服務中的異常處理、日志記錄和通知:綜合指南

簡介 Azure 應用服務是基于云的應用程序&#xff0c;使開發人員能夠在云上構建、部署和管理應用程序。與任何應用程序一樣&#xff0c;制定適當的異常處理、日志記錄和通知實踐至關重要&#xff0c;以確保應用程序平穩運行&#xff0c;并快速識別和解決任何問題。在本篇博文中&…

Java 應用如何實現 HTTPS:加密數據傳輸的實用指南

Java 應用如何實現 HTTPS&#xff1a;加密數據傳輸的實用指南 在當今的互聯網環境中&#xff0c;數據安全至關重要&#xff0c;HTTPS 作為加密的數據傳輸協議&#xff0c;為 Java 應用提供了安全通信的保障。本文將深入探討 Java 應用如何實現 HTTPS&#xff0c;通過詳細代碼實…

域名與DNS詳解

域名與DNS詳解 一、核心概念 域名&#xff08;Domain Name&#xff09; 定義&#xff1a;人類可讀的網絡地址標識&#xff08;如 www.google.com&#xff09;作用&#xff1a;替代復雜IP地址&#xff08;類似"手機通訊錄"功能&#xff09; DNS&#xff08;Domain …

c++20引入的三路比較操作符<=>

目錄 一、簡介 二、三向比較的返回類型 2.1 std::strong_ordering 2.2 std::weak_ordering 2.3 std::partial_ordering 三、對基礎類型的支持 四、自動生成的比較運算符函數 4.1 std::rel_ops的作用 4.2 使用<> 五、兼容他舊代碼 一、簡介 c20引入了三路比較操…

計算機網絡相關面試題

一、HTTP1.1和HTTP2的區別 HTTP/1&#xff08;主要指 HTTP/1.1&#xff09;和 HTTP/2 是 Web 協議發展中的兩個重要版本&#xff0c;二者在性能、協議機制和功能特性上有顯著差異。以下從多個維度對比分析&#xff0c;并結合具體案例說明&#xff1a; 一、連接與請求處理方式 1…

圖論算法精解(Java 實現):從基礎到高頻面試題

一、圖的基礎表示方法 1.1 鄰接矩陣&#xff08;Adjacency Matrix&#xff09; 鄰接矩陣是表示圖的一種直觀方式&#xff0c;它使用一個二維數組來存儲節點之間的連接關系。對于一個有 n 個節點的圖&#xff0c;鄰接矩陣是一個 nn 的矩陣&#xff0c;其中 matrix [i][j] 表示…

江科大TIM定時器hal庫實現

定時器相關hal庫函數 hal庫的定時器函數相比于標準庫&#xff0c;多了很多的中斷回調函數&#xff0c;同時對于定時器的初始化也改成使用句柄一次性順帶連帶DMA等功能一起初始化了 typedef struct {uint32_t Prescaler; /*定時器的預分頻值*/uint32_t CounterMode; …