【RuoYi】實現文件的上傳與下載

一、前言

? ?首先,最近在做一個管理系統,里面剛好需要用到echarts圖和富文本編輯器,然后我自己去看了官網覺得有點不好懂,于是去B站看來很多視頻,然后看到了up主【程序員青戈】的視頻,看了他講的echarts圖和富文本編輯器部分的內容,覺得講的很好,很推薦大家去觀看他的視頻。然后在富文本編輯器這部分內容中,需要用到,文件上傳與下載的部分知識,所以這里做一個筆記,來記錄關于這部得分的內容,echarts圖和富文本編輯器部分的內容也會在后面的博客中介紹。希望對大家有所幫助啦~

二、準備工作

? ?導入hutool的依賴

        <!--hutool工具類--><!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency>

三、文件上傳與下載代碼

? ?如下所示,是跟著青戈學的已經封裝好的代碼,大家可以直接拿來用。但是需要注意的是,我用的是RuoYi的框架,所以最后返回的是RuoYi封裝好的AjaxResult結果集,而不是青戈自己寫的Result結果集,就這里需要注意以下。

@RestController
@Api(tags = "文件上傳與下載模塊")
@RequestMapping("/file")
public class FileController extends BaseController {@Value("${ip:localhost}")String ip;//通過配置文件拿到ip@Value("${server.port}")String port;private static final String ROOT_PATH = System.getProperty("user.dir")+ File.separator+"files";//文件根目錄@ApiOperation(value = "文件上傳")@PostMapping("/upload")public AjaxResult Upload(@RequestPart("file") MultipartFile file) throws IOException {//MultipartFile file 輸入的文件String originalFilename = file.getOriginalFilename();//originalFilename是獲取源文件名String mainName = FileUtil.mainName(originalFilename);// mainName 是主文件名String extName = FileUtil.extName(originalFilename);//extName 是文件的標識 png、pdf等if(!FileUtil.exist(ROOT_PATH)){//通過hutool工具類中的FileUtil來判斷我們的根目錄是否存在,若不存在則在根目錄下創建file文件夾FileUtil.mkdir(ROOT_PATH);}//判斷file文件夾中傳入的文件是否存在,若存在為了防止重名不被替換,則需要對文件重新命名if(FileUtil.exist(ROOT_PATH+File.separator+originalFilename)){originalFilename=System.currentTimeMillis()+"_"+mainName+"."+extName;}File saveFile = new File(ROOT_PATH + File.separator + originalFilename);//創建一個file文件對象,方便寫入磁盤file.transferTo(saveFile);//存儲文件到本地磁盤里面去String url ="http://"+ip+":"+port+"/file/download/"+originalFilename;//問價下載的路徑return AjaxResult.success(url);//RuoYi自帶的結果集}@ApiOperation(value = "文件下載")@GetMapping("/download/{fileName}")public void download(@PathVariable String fileName, HttpServletResponse response) throws IOException {
//        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));//文件下載response.addHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(fileName,"UTF-8"));//文件預覽String filePath = ROOT_PATH+File.separator+fileName;//拿到文件的路徑if(!FileUtil.exist(filePath)){//文件不存在,就不用管,因為沒有東西可寫return;}byte[] bytes = FileUtil.readBytes(filePath);//使用FileUtil從filePath中去讀取文件ServletOutputStream outputStream = response.getOutputStream();outputStream.write(bytes);//把文件的字節數寫出去outputStream.flush();//刷新一下outputStream.close();//一定要關閉文件流}
}

接口測試

我們在測試接口時,可以直接使用RuoYi框架為我們提供的Swagger來測試接口,當然也可以用PostMan,看個人的習慣來定了。

bbe54ea0ff974437a3f132f5fe6e4682.png

a6711e0d31e147cba7d4d9d88e5f4805.png

8a7c4224decc43f6beff175d7cbf0dc1.png

文件上傳成功返回碼為200,而且在Idea中生成file文件夾

1242212e892b4a4c9a311d464e4791e0.png

57a9f1faf2304ae78ca45bd3552d37e3.png

到此我們的文件上傳與下載的接口就完成了,接下來我們來看看如何在前端使用我們的該功能。

四、實踐

①單文件上傳

da561baecfeb49de9762768906024a99.png

如上圖所示,我們現在要完成一個點擊功能,從而實現用戶頭像的上傳與顯示,這個功能也是我們在做項目中很常見的功能。

思路:上傳圖片->保存數據庫->再從數據庫拿到圖片路徑

先完成文件的上傳:

05f047e215dc457885107c79fd926ed3.png

注意:我們使用的是RuoYi框架中的AjaxResult結果集,返回的數據是在response下的msg中

bf68590f7fa04edfa67326fb10bbb101.png

JS中代碼

    handleTableFileUpload(row,file,fileList){console.log(row,file)row.stuAvatar=file.response.msg//注意我們使用的是RuoYi框架中的AjaxResult結果集,返回的數據是在response下的msg中//觸發更新//使用RuoYi中封裝好的updateStudent()函數,將當前對象更新updateStudent(row).then(response => {if(response.code=='200'){this.$message.success("上傳成功")}else{this.$message.success("上傳失敗")}this.form = response.data;});}

頭像顯示代碼:

7cd6da79d60a4fc694edec61a9fa41d0.png

效果如下:

8fa802193bf14a8e9bcc4058517616ad.png

②多文件上傳

多文件其實是基于單文件的,就是在單文件的基礎上,多次請求即可。我們也可以做個簡單的案例測試。先在element-ui隨便找一個文件上傳的前端頁面,如下圖所示:

b15d1a2133634dcc904d108af8057a05.png

放在我們的RuoYi的項目中:

2a01bafe498047b691df4e098c9116ee.png

400e8f62200e4730ad4d25a0ffc7bcc0.png

12b6eeabdec94234bd1b3455f7c98009.png

測試:

74b57ed4df6f43ed9b7d584848596aff.png

a4c3d68d69704cc4aed5f279629a5995.png

如上圖所示,我們可以成功的拿到三張圖片的地址,此時我們只需要,將其存入數據庫,再從數據庫中拿出來顯示即可,大家下來試一試即可,我這里就不做測試了。

五、總結

? ?跟著青戈學習了這個文件上傳與下載的的視頻,自己真的學到了很多,這個文件上傳下載的功能不僅適用于圖片,也可以用在pdf、word等文件中,也希望這些內可以幫助屏幕前的小伙伴們,如果有所幫助,別忘了點贊、關注一波哦~

?

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

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

相關文章

k8s 部署 Dashboard

Dashboard 是官方提供的一個UI&#xff0c;可用于基本管理K8s資源。 # 在master節點執行# wget \ https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml vi recommended.yaml 增加 nodePort: 30001 和 type: NodePort ...... spec:p…

一步一步寫線程之十四并行編程和并行庫

一、并行編程 多線程和多進程編程&#xff0c;在早期一般是并發編程&#xff0c;現在基本是并行編程的基礎。或者干脆就叫并行編程也沒有什么可糾結的。但實際上并發編程和并行編程還是有著很大的不同。在前面的“多核和多CPU編程”系列中&#xff0c;已經對并發和并行的概念以…

利用Python處理DAX多條件替換

小A&#xff1a;白茶&#xff0c;救命啊~~~ 白茶&#xff1a;什么情況&#xff1f; 小A&#xff1a;是這樣的&#xff0c;最近不是臨近項目上線嘛&#xff0c;有一大波度量值需要進行類似的調整&#xff0c;一個兩個倒沒啥&#xff0c;600多個&#xff0c;兄弟&#xff0c;救命…

從JS角度直觀理解遞歸的本質

讓我們寫一個函數 pow(x, n)&#xff0c;它可以計算 x 的 n 次方。換句話說就是&#xff0c;x 乘以自身 n 次。 有兩種實現方式。 迭代思路&#xff1a;使用 for 循環&#xff1a; function pow(x, n) {let result 1;// 在循環中&#xff0c;用 x 乘以 result n 次for (let i…

Springboot中使用spel+自定義注解實現權限控制

使用spel+自定義注解實現權限控制的案例很多, 比如springsecurity,本文也是一同樣的方式實現權限校驗 定義注解 package com.example.demo.anno;import java.lang.annotation.ElementType; import java.lang.annotation.

opencv進階 ——(九)圖像處理之人臉修復祛馬賽克算法CodeFormer

算法簡介 CodeFormer是一種基于AI技術深度學習的人臉復原模型&#xff0c;由南洋理工大學和商湯科技聯合研究中心聯合開發&#xff0c;它能夠接收模糊或馬賽克圖像作為輸入&#xff0c;并生成更清晰的原始圖像。算法源碼地址&#xff1a;https://github.com/sczhou/CodeFormer…

如何快速找到 RCE

背景介紹 本文將分享國外白帽子在‘偵察’階段如何快速發現 RCE 漏洞的經歷。以Apache ActiveMQ 的 CVE-2023–46604 為特例&#xff0c;重點介紹如何發現類似此類的漏洞&#xff0c;讓我們開始吧。 快速發現過程 在‘偵察’階段&#xff0c;白帽小哥會保持每周更新一次目標…

1940java swing零售庫存管理系統myeclipse開發Mysql數據庫CS結構java編程

一、源碼特點 java swing 零售庫存管理系統 是一套完善的窗體設計系統&#xff0c;對理解SWING java 編程開發語言有幫助&#xff0c;系統具有完整的源代碼和數據庫&#xff0c;&#xff0c;系統主要采用C/S模式開發。 應用技術&#xff1a;javamysql 開發工具&#xff1a;…

適合技術小白學習的項目1863java在線視頻網站系統 Myeclipse開發mysql數據庫web結構java編程計算機網頁項目

一、源碼特點 java在線視頻網站系統 是一套完善的web設計系統&#xff0c;對理解JSP java編程開發語言有幫助采用了java設計&#xff0c;系統具有完整的源代碼和數據庫&#xff0c;系統采用web模式&#xff0c;系統主要采用B/S模式開發。 開發環境為TOMCAT7.0,Myeclipse8.5開發…

數據庫、數據表的基本操作

1.數據庫的基本操作 &#xff08;1&#xff09;創建數據庫 &#xff08;2&#xff09;刪除數據庫 &#xff08;3&#xff09;將數據庫的字符集修改為gbk gbk是漢字內碼擴展規范&#xff0c;是GB2312和GB13000的擴展&#xff0c;主要用于簡體中文。 &#xff08;4&#xff09;…

LabVIEW在高校電力電子實驗中的應用

概述&#xff1a;本文介紹了如何利用LabVIEW優化高校電力電子實驗&#xff0c;通過圖形化編程實現參數調節、實時數據監控與存儲&#xff0c;并與Simulink聯動&#xff0c;提高實驗效率和數據處理能力。 需求背景高校實驗室在進行電機拖動和電力電子實驗時&#xff0c;通常使用…

前端框架安全防范

前端框架安全防范 在現代Web開發中&#xff0c;前端框架如Angular和React已經成為構建復雜單頁面應用&#xff08;SPA&#xff09;的主流工具。然而&#xff0c;隨著應用復雜度的增加&#xff0c;安全問題也變得越來越重要。本文將介紹如何在使用Angular和React框架時&#xf…

Java中的synchronized關鍵字詳解

Java中的synchronized關鍵字詳解 1. 引言 在Java編程中&#xff0c;多線程是提高應用性能的重要手段之一。然而&#xff0c;多線程環境下共享資源的訪問控制成為必須面對的問題。synchronized關鍵字作為Java語言提供的一種同步機制&#xff0c;能夠有效地解決這一問題。本文將…

施耐德 BAS PLC 基本操作指南

CPU 型號 項目使用的 PLC 型號為&#xff1a;施耐德昆騰 Quantum 140 CPU 67160 P266 CPU &#xff0c;支持熱備冗余&#xff0c;內部存儲 1024K&#xff0c;支持 2 個 PCMCIA 擴展卡槽CPU 模塊自帶接口&#xff1a;MB 串口接口、MB 串口接口、USB 接口、以太網接口&#xff…

MATLAB算法實戰應用案例精講-【數模應用】聯合分析(附python和MATLAB代碼實現)

目錄 前言 算法原理 什么是聯合分析? 聯合分析的基本原理與步驟

【HarmonyOS】List組件多層對象嵌套ForEach渲染更新的處理

【HarmonyOS】List組件多層對象嵌套ForEach渲染更新的處理 問題背景&#xff1a; 在鴻蒙中UI更新渲染的機制&#xff0c;與傳統的Android IOS應用開發相比。開發會簡單許多&#xff0c;開發效率提升顯著。 一般傳統應用開發的流程處理分為三步&#xff1a;1.畫UI&#xff0c;…

TiDB-從0到1-分布式存儲

TiDB從0到1系列 TiDB-從0到1-體系結構TiDB-從0到1-分布式存儲TiDB-從0到1-分布式事務TiDB-從0到1-MVCC 一、TiDB-DML語句執行流程&#xff08;增刪改&#xff09; DML流程概要 1、協議驗證 用戶連接到TiDB Server后首先工作的是Protocol Layer模塊&#xff0c;該模塊會對用…

mysql表字段超過多少影響性能 mysql表多少效率會下降

一直有傳言說&#xff0c;MySQL 表的數據只要超過 2000 萬行&#xff0c;其性能就會下降。而本文作者用實驗分析證明&#xff1a;至少在 2023 年&#xff0c;這已不再是 MySQL 表的有效軟限制。 傳言 互聯網上有一則傳言說&#xff0c;我們應該避免單個 MySQL 表中的數據超過 …

內網滲透-在HTTP協議層面繞過WAF

進入正題&#xff0c;隨著安全意思增強&#xff0c;各企業對自己的網站也更加注重安全性。但很多web應用因為老舊&#xff0c;或貪圖方便想以最小代價保證應用安全&#xff0c;就只僅僅給服務器安裝waf。 本次從協議層面繞過waf實驗用sql注入演示&#xff0c;但不限于實際應用…

[數據集][目標檢測]輪胎檢測數據集VOC+YOLO格式439張1類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;439 標注數量(xml文件個數)&#xff1a;439 標注數量(txt文件個數)&#xff1a;439 標注類別…