前端使用原生JS怎么上傳本地路徑的文件到后端【附源碼】

本文不使用<input type="file">等前端上傳組件

一、為什么不能使用本地文件路徑上傳?

前端不能直接根據本地文件路徑(例如 C:\Users\Username\Documents\image.jpg)上傳文件到后端服務器,原因主要在于瀏覽器的安全策略限制。以下是幾個關鍵點解釋這一限制:

  1. 同源策略(Same-origin policy):瀏覽器實施的安全策略之一,旨在防止不同源的網頁讀取對方的資源。這意味著網頁上的JavaScript無法訪問本地文件系統中的文件,除非這些文件是通過用戶交互(如 <input type="file">)明確選擇的。

  2. 沙箱模型(Sandbox model):現代瀏覽器運行JavaScript代碼時,使用沙箱環境來隔離網頁內容,確保網頁腳本不能無授權地訪問用戶計算機上的文件或其他敏感資源。

  3. 安全限制:直接允許JavaScript訪問和上傳本地文件路徑可能會引發嚴重的安全問題,比如惡意腳本可以未經用戶許可就竊取用戶硬盤上的私人數據。

  4. 文件API:為了支持文件上傳,HTML5引入了File API,允許Web應用在用戶選擇文件后讀取文件內容,而不是直接操作文件路徑。用戶通過 <input type="file"> 選擇文件后,瀏覽器提供文件的臨時虛擬路徑(例如,一個Blob對象或File對象),這些對象可以在JavaScript中操作并上傳到服務器,但不會暴露實際的本地文件系統路徑。

二、實操

1、后端轉base64

我們根據本地的路徑地址轉換為base64編碼傳到前端

    public static String convertImageToBase64(String imagePath) {try {// 讀取圖片文件BufferedImage bufferedImage = ImageIO.read(new File(imagePath));// 創建輸出流ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 將圖片寫入輸出流,格式為JPEGImageIO.write(bufferedImage, "jpg", byteArrayOutputStream);// 將字節數組轉換為Base64編碼byte[] imageBytes = byteArrayOutputStream.toByteArray();return Base64.getEncoder().encodeToString(imageBytes);} catch (IOException e) {e.printStackTrace();return null;}}

2、前端轉換為Blob對象

從后端傳過來的base64編碼轉換為Blob對象。

    // 將base64編碼的數據轉換為Blob對象function base64toBlob(base64Data, contentType = '') {// 設置內容類型contentType = contentType || '';// 將base64編碼的數據轉換為字節字符const byteCharacters = atob(base64Data);// 創建字節數組const byteNumbers = new Array(byteCharacters.length);// 遍歷字節字符,轉換為字節數字for (let i = 0; i < byteCharacters.length; i++) {byteNumbers[i] = byteCharacters.charCodeAt(i);}// 將字節數字轉換為Uint8Arrayconst byteArray = new Uint8Array(byteNumbers);// 創建并返回Blob對象return new Blob([byteArray], {type: contentType});}

3、上傳

再進行對應數據的上傳,切記不能在同一個請求里面多次調用請求方法。所以我們需要進行封裝。

    async function uploadFileWithFetch(fileBlob, imagePath) {const formData = new FormData();formData.append('file', fileBlob, imagePath);try {
//文件上傳請求路徑const response = await fetch('/car/distinguish/upload', {method: 'POST',body: formData, // 自動設置Content-Type為multipart/form-data});if (!response.ok) {throw new Error(`HTTP error! status: ${response.status}`);}const result = await response.json();console.log('圖片上傳成功', result.msg + ":" + result.plateNumber);return result;} catch (error) {console.error('圖片上傳失敗', error);}}

在后端我們的 file 里面就可以拿到我們前端上傳的文件了。

    @RequestMapping("upload")public Result upload(MultipartFile file)

三、應用場景

這個應用場景主要指的是前端上傳文件到后端的流程,具體包括但不限于以下幾種:

  1. 社交媒體:用戶上傳個人頭像、分享照片、視頻或文檔到自己的動態或時間線。

  2. 在線文檔編輯與存儲服務:用戶上傳Word、Excel、PDF等文檔到云端,以便在線預覽、編輯和存儲。

  3. 電子商務:商家上傳商品圖片、用戶上傳購物評價中的圖片或視頻證據。

  4. 內容管理系統(CMS):網站管理員或編輯上傳文章配圖、多媒體內容到網站后臺。

  5. 云存儲服務:用戶上傳個人或工作文件到Dropbox、Google Drive、阿里云OSS等云存儲平臺。

  6. 簡歷投遞與在線應聘:求職者上傳簡歷、作品集或項目演示文件到招聘網站或公司門戶。

  7. 教育平臺:學生上傳作業、論文或項目報告,教師上傳教學資源。

  8. 博客與論壇:用戶上傳文章插圖、論壇附件或個人簽名圖片。

  9. 醫療健康平臺:患者上傳醫療報告、影像資料,醫生上傳處方或診斷說明。

  10. 政府與企業服務:公民或員工上傳申請材料、稅務文件或企業報告到在線服務平臺。

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

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

相關文章

使用java遠程提交flink任務到yarn集群

使用java遠程提交flink任務到yarn集群 背景 由于業務需要&#xff0c;使用命令行的方式提交flink任務比較麻煩&#xff0c;要么將后端任務部署到大數據集群&#xff0c;要么弄一個提交機&#xff0c;感覺都不是很離線。經過一些調研&#xff0c;發現可以實現遠程的任務發布。…

LOTO示波器軟件PC緩存(波形錄制與回放)功能

當打開PC緩存功能后, 軟件將采用先進先出的原則排隊對示波器采集的每一幀數據, 進行幀緩存。 當發現屏幕中有感興趣的波形掠過時, 鼠標點擊軟件的(暫停)按鈕, 可以選擇回看某一幀的波形。一幀數據的量 是 當前用戶選擇時基檔位緩沖區總數據大小。不同時基檔位緩沖區大小不同&am…

談談std::map的lower_bound

我們知道std::map內部是一個紅黑樹&#xff0c;放到std::map里的數據等有一個能比較大小的方法。它相當于java里面的TreeMap。 它里面有個lower_bound方法&#xff0c;返回一個迭代器&#xff0c;它指向map里第一個大于等于參數的元素。 方法的簽名很簡單&#xff0c;但是在不同…

富格林:有效預防黑幕阻撓被騙

富格林指出&#xff0c;在投資領域&#xff0c;現貨黃金是一種備受推崇的貴金屬投資品種。倘若能有效預防黑幕阻撓被騙的情況&#xff0c;事實上現貨黃金是很多投資者的“理想型”。然而要想有效地預防黑幕阻撓被騙&#xff0c;就需要掌握足夠多的投資技巧。為此&#xff0c;富…

Milvus 基本概念

Milvus 是一個開源的向量數據庫&#xff0c;專門用于高效地存儲、管理和檢索大規模向量數據。它基于 Apache 許可證 2.0 版本發布&#xff0c;由 Zilliz 公司開源并維護。 Milvus 的設計理念是為了解決向量數據存儲和檢索的挑戰。在許多應用中&#xff0c;向量數據是一種重要的…

強化學習——馬爾可夫過程的理解

目錄 一、馬爾可夫過程1.隨機過程2.馬爾可夫性質3.馬爾可夫過程4.馬爾可夫過程示例 參考文獻 一、馬爾可夫過程 1.隨機過程 隨機過程是概率論的“動態”版本。普通概率論研究的是固定不變的隨機現象&#xff0c;而隨機過程則專注于那些隨時間不斷變化的情況&#xff0c;比如天…

C# 使用channel 實現Plc 異步任務之間的通信

channel 通信的例子: using ConsoleApp2; using System.Collections.Concurrent; using System.Threading.Channels;var queue = new BlockingCollection<Message>(new ConcurrentQueue<Message>());var opt = new BoundedChannelOptions(10) {FullMode = BoundedC…

Linux環境快速部署mysql5.7

1 網絡下載rpm包 wget -c https://repo.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-5.7.37-1.el7.x86_64.rpm-bundle.tar2 解壓 tar xf mysql-5.7.37-1.el7.x86_64.rpm-bundle.tar3 數據庫之間會沖突因此需要卸載mariadb-libs yum remove mariadb-libs4 安裝 如果沒有…

R語言兩種方法實現隨機分層抽樣

為了減少數據分布的不平衡&#xff0c;提供高樣本的代表性&#xff0c;可將數據按特征分層一定的層次&#xff0c;在每個層次抽取一定量的樣本&#xff0c;為分層抽樣。分層抽樣的特點是將科學分組法與抽樣法結合在一起&#xff0c;分組減小了各抽樣層變異性的影響&#xff0c;…

HTTP協議及Python實現

最近的項目需要頻繁在前后端之間傳輸數據&#xff0c;本篇主要介紹HTTP協議以及數據傳輸方法。 1 HTTP協議 1.1 http協議簡介 HTTP(Hypertext Transfer Protocol)是一種用于傳輸超文本數據的應用層協議。它是萬維網上數據交換的基礎&#xff0c;定義了客戶端和服務器之間進行通…

C語言指針詳解(三)

目錄 前言 一. 回調函數是什么&#xff1f; 1.定義 2. 代碼示例&#xff1a;計數器 2.1 使用回調函數改造前 2.2 使用回調函數改造后 二. qsort使用舉例 1. qsort介紹 2. 使用qsort函數排序整型數據 3. 使用qsort排序結構體數據 三. qsort函數的模擬實現 四. sizeo…

代碼隨想錄:螺旋矩陣II相關題目推薦(54、LCR146)

59.螺旋矩陣II 題目 給你一個正整數 n &#xff0c;生成一個包含 1 到 n2 所有元素&#xff0c;且元素按順時針順序螺旋排列的 n x n 正方形矩陣 matrix 。 示例 1&#xff1a; 輸入&#xff1a;n 3 輸出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 代碼&#xff08;新解法&am…

MyBatis——MyBatis 參數處理

一、單個簡單類型參數 簡單類型包括&#xff1a; byte short int long float double char Byte Short Integer Long Float Double Character String java.util.Date java.sql.Date parameterType 屬性&#xff1a;告訴 MyBatis 參數的類型 MyBatis 自帶類型自動推斷機制…

LLM應用-prompt提示:生成搜索相關問題、生成回答格式包含參考資料

參考: https://isou.chat/ (AI回答與相關問題都是根據問題的搜索引擎結果結合大模型生成的) prompt參考: https://github.com/yokingma/search_with_ai/blob/6d32aa8f05f5f6ee12b5204787035b3f7797c22a/src/prompt.ts#L8 ##rag 根據搜索結果知識回答RagQueryPrompt = ` …

在Go語言中,可以這樣使用Json

在Go語言中&#xff0c;處理JSON數據通常涉及編碼&#xff08;將Go結構體轉換為JSON字符串&#xff09;和解碼&#xff08;將JSON字符串轉換為Go結構體&#xff09;。Go標準庫中的encoding/json包提供了這些功能。第三方插件可以使用"github.com/goccy/go-json"也有同…

Git | git log 和 git status 的區別

如是我聞&#xff1a; git log和git status是Git中的兩個非常有用的命令&#xff0c;它們用于不同的目的&#xff0c;并提供不同類型的信息。 git log git log命令用于顯示一個或多個分支的提交歷史記錄。這個命令會列出提交歷史&#xff0c;包括每次提交的SHA-1哈希值、提交…

程控水冷阻性負載主要工作方式

程控水冷阻性負載是一種先進的電力設備&#xff0c;主要用于電力系統的測試和研究。它的主要工作方式是通過控制水冷系統的溫度&#xff0c;來模擬不同的阻性負載條件&#xff0c;從而對電力設備進行各種性能測試。 首先&#xff0c;我們需要了解什么是阻性負載。阻性負載是指那…

博弈智能的特點

博弈智能是指通過算法和模型對博弈過程進行分析和決策的智能系統。在博弈中&#xff0c;各方參與者追求自身利益和目標&#xff0c;會采取各種策略來達到自己的目標。其中&#xff0c;包括了一些不正當手段&#xff0c;如詭計和欺騙&#xff08;詭&#xff09;&#xff08;詐&a…

代碼隨想錄算法訓練營Day 42| 動態規劃part04 | 01背包問題理論基礎I、01背包問題理論基礎II、416. 分割等和子集

代碼隨想錄算法訓練營Day 42| 動態規劃part04 | 01背包問題理論基礎I、01背包問題理論基礎II、416. 分割等和子集 文章目錄 代碼隨想錄算法訓練營Day 42| 動態規劃part04 | 01背包問題理論基礎I、01背包問題理論基礎II、416. 分割等和子集01背包問題理論基礎一、01背包問題二、…

WSL設置啟動時自動啟動docker服務或其他服務

方式一: Windows系統的WSL,當windows關機再開機后,WSL等于是重新開機的,默認情況下,不會啟動Docker服務。例如在Ubuntu 22.04中,需要使用命令 service docker start來啟動。由于我習慣關機斷電,因此每天開機打開WSL后都要手動輸入這個命令,非常麻煩。所以找了一個方法…