Java通過文件流和文件地址下載文件

在這里插入圖片描述

通過文件流下載文件

如何使用 MultipartFile 進行文件上傳、下載到本地,并返回保存路徑呢:

import org.springframework.web.multipart.MultipartFile;import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;public class FileUtils {private static final String UPLOAD_DIR = "/path/to/upload/directory/"; // 修改為您的上傳目錄public static String saveFileAndGetPath(MultipartFile file) throws IOException {String originalFileName = file.getOriginalFilename();String fileName = generateFileName(originalFileName);String filePath = UPLOAD_DIR + fileName;try (InputStream inputStream = file.getInputStream();BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(filePath))) {byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}}return filePath;}private static String generateFileName(String originalFileName) {String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 時間戳精確到秒int dotIndex = originalFileName.lastIndexOf(".");String extension = (dotIndex != -1) ? originalFileName.substring(dotIndex) : "";String fileNameWithoutExtension = (dotIndex != -1) ? originalFileName.substring(0, dotIndex) : originalFileName;return fileNameWithoutExtension + "_" + timestamp + extension;}
}

用于在 Spring Boot 應用中獲取文件流,然后處理上傳的文件,將文件保存到指定目錄并返回保存的文件路徑。下面對代碼的各個部分進行簡要介紹:

  1. 上傳目錄設置:在這個示例中,UPLOAD_DIR 常量用于定義上傳文件的目錄路徑。您需要將其修改為您實際希望保存上傳文件的路徑。

  2. 保存文件并獲取路徑saveFileAndGetPath 方法接收一個 MultipartFile 對象,表示上傳的文件。在該方法中,將上傳的文件保存到指定的目錄中,并返回保存后的文件路徑。

  3. 生成文件名generateFileName 方法用于生成帶時間戳的新文件名,以避免文件名沖突。它使用當前時間的時間戳(精確到秒)作為文件名的一部分,并保留原始文件名的擴展名。

  4. 上傳邏輯:在 saveFileAndGetPath 方法中,使用 MultipartFile 對象的輸入流來讀取上傳文件的內容,并通過輸出流將內容寫入指定的文件路徑。

通過文件地址下載文件

package com.ruoyi.im.utils;import com.ruoyi.common.config.RuoYiConfig;
import lombok.extern.slf4j.Slf4j;import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;@Slf4j
public class FileUtils {/*** 默認路徑*/private static String defaultBaseDir = RuoYiConfig.getProfile();/*** 下載并保存文件** @param url              url* @param originalFileName 原始文件名字* @return {@code String}*/public static String downloadAndSaveFile(String url, String originalFileName) {try {URL fileUrl = new URL(url);HttpURLConnection connection = (HttpURLConnection) fileUrl.openConnection();connection.setRequestMethod("GET");String fileName = generateFileNameWithTimestamp(originalFileName);String savePath = generateSavePath(fileName);try (InputStream inputStream = connection.getInputStream();BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(savePath))) {byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}return convertToReturnPath(savePath);}} catch (IOException e) {e.printStackTrace();log.error("Error: " + e.getMessage());return null;}}/*** 生成文件名字和時間戳** @param originalFileName 原始文件名字* @return {@code String}*/private static String generateFileNameWithTimestamp(String originalFileName) {String timestamp = getCurrentTimestamp();int dotIndex = originalFileName.lastIndexOf(".");String extension = "";if (dotIndex != -1) {extension = originalFileName.substring(dotIndex);originalFileName = originalFileName.substring(0, dotIndex);}return originalFileName + "_" + timestamp + extension;}/*** 生成保存路徑** @param fileName 文件名稱* @return {@code String}*/private static String generateSavePath(String fileName) {Date currentDate = new Date();SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");SimpleDateFormat monthFormat = new SimpleDateFormat("MM");SimpleDateFormat dayFormat = new SimpleDateFormat("dd");String year = yearFormat.format(currentDate);String month = monthFormat.format(currentDate);String day = dayFormat.format(currentDate);String filePath = defaultBaseDir + "/upload/" + year + "/" + month + "/" + day + "/";return filePath + fileName;}/*** 轉換返回路徑** @param filePath 文件路徑* @return {@code String}*/private static String convertToReturnPath(String filePath) {String relativePath = filePath.replace(defaultBaseDir, "/profile");return relativePath.replace("\\", "/");}/*** 獲得當前時間戳** @return {@code String}*/public static String getCurrentTimestamp() {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");Date currentDate = new Date();return dateFormat.format(currentDate);}
}

用于根據文件URL地址處理文件的下載、保存和路徑轉換操作。下面對代碼的各個部分進行簡要介紹:

  1. 導入和日志記錄:導入了所需的類和包,使用了 @Slf4j 注解來自動生成日志記錄代碼。

  2. 默認路徑和方法

    • defaultBaseDir:默認的文件保存路徑,通過 RuoYiConfig.getProfile() 方法獲取,您需要將其設置為實際的文件保存目錄。
    • downloadAndSaveFile(String url, String originalFileName):下載文件并保存到本地,接收文件的 URL 和原始文件名作為參數。
    • generateFileNameWithTimestamp(String originalFileName):根據原始文件名生成帶時間戳的新文件名。
    • generateSavePath(String fileName):根據文件名生成保存的文件路徑,包括年、月、日的子目錄。
    • convertToReturnPath(String filePath):將文件路徑轉換為返回的相對路徑格式。
  3. 下載文件邏輯:在 downloadAndSaveFile 方法中,通過創建一個 URL 連接,打開連接并獲取文件流。然后使用輸入流和輸出流將文件保存到本地指定的目錄中,生成新的文件名以避免沖突。

  4. 生成保存路徑:使用當前日期和時間生成保存文件的路徑,包括年、月和日的子目錄。

  5. 轉換返回路徑:將保存的文件路徑轉換為相對于默認路徑 /profile 的相對路徑格式。

  6. 獲取當前時間戳:通過 getCurrentTimestamp 方法獲取當前時間的時間戳,精確到秒,用于生成帶時間戳的文件名。

具體使用

很簡單,直接調用即可!!!

@GetMapping("/download")public AjaxResult downloadFilebyUrl(@RequestParam String url, @RequestParam String fielName) {String path = FileUtils.downloadAndSaveFile(url, fielName);if (StringUtils.isNotBlank(path)) {return AjaxResult.success(path);} else {return AjaxResult.error("文件下載失敗!!!");}}

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

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

相關文章

Redis_緩存2_緩存刪除和淘汰策略

14.5 緩存數據的刪除和替換 14.5.1 過期數據 可以使用ttl查看key的狀態。已過期的數據,redis并未馬上刪除。優先去執行讀寫數據操作,刪除操作延后執行。 14.5.2 刪除策略 redis中每一個value對應一個內存地址,在expires,一個內…

BC117 小樂樂走臺階(附完整代碼)

描述 小樂樂上課需要走n階臺階,因為他腿比較長,所以每次可以選擇走一階或者走兩階,那么他一共有多少種走法? 輸入描述 輸入包含一個整數n (1 ≤ n ≤ 30) 輸出描述 輸出一個整數,即小樂樂可以走的方法數。 思路&a…

分享個試卷去筆跡什么軟件,幾個步驟輕松擦除

試卷擦去筆跡是一項非常關鍵的技能,它可以幫助你更好地管理你的筆記和文件。不管是小伙伴們想重新測試試卷或者是將試卷輸出為電子版,都可以實現的。在這篇文章中,我將分享一些方法和軟件,幫助你更好地進行試卷擦除。有需要的小伙…

個人博客系統測試報告

文章目錄 一、功能測試1.編寫測試用例2.總結測試后發現的BUG 二、UI自動化測試0.搭建測試環境1. 創建公共類2.注冊頁面UI自動化測試用例編寫3.登錄頁面UI自動化測試用例編寫4.用戶博客列表頁面自動化測試5. 修改個信息頁面6. 文章編輯頁面7. 設置密保問題發現bug 8. 所有用戶文…

Stable Diffusion +EbSynth應用實踐和經驗分享

Ebsynth應用 1.安裝ffmpeg 2.安裝pip install transparent-background,下載模型https://www.mediafire.com/file/gjvux7ys4to9b4v/latest.pth/file 放到C:\Users\自己的用戶名.transparent-background\加一個ckpt_base.pth文件 3.秋葉安裝ebsynth插件,重啟webui 填寫項目基本…

Redis 持久化及集群架構

Redis 持久化及集群架構 本篇技術博文將深入探討 Redis 持久化機制的原理、配置和使用方式。我們將介紹兩種常用的持久化方式:RDB 持久化和 AOF 持久化。您將了解到它們的工作原理、優缺點以及如何根據需求選擇合適的持久化方式。 通過深入學習 Redis 持久化及集群…

Rest 優雅的url請求處理風格及注意事項

😀前言 本篇博文是關于Rest 風格請求的應用和注意事項,希望能夠幫助到您😊 🏠個人主頁:晨犀主頁 🧑個人簡介:大家好,我是晨犀,希望我的文章可以幫助到大家,您…

應急響應-Webshell

文章目錄 一、Webshell概述什么是WebshellWebshell分類基于編程語言基于文件大小/提供的功能多少 Webshell 檢測方法 二、常規處置方法三、技術指南1、初步預判2、 Webshell排查3、Web日志分析(查找攻擊路徑及失陷原因)4、系統排查4.1 Windows4.2 Linux …

CSS中的position屬性有哪些值,并分別描述它們的作用。

聚沙成塔每天進步一點點 ? 專欄簡介? static? relative? absolute? fixed? sticky? 寫在最后 ? 專欄簡介 前端入門之旅:探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅!這個專欄是為那…

通達OA SQL注入漏洞【CVE-2023-4166】

通達OA SQL注入漏洞【CVE-2023-4166】 一、產品簡介二、漏洞概述三、影響范圍四、復現環境POC小龍POC檢測工具: 五、修復建議 免責聲明:請勿利用文章內的相關技術從事非法測試,由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及損…

C/C++ 標準模版庫STL(持續更新版)

標準模版庫STL <algorithm> 算法庫 max, min 用于找出一組值中的最大值和最小值 swap 用于交換兩個變量的值 sort 用于對一個范圍內的元素進行排序 lower_bound, upper_bound 用于在已排序的容器中查找元素的下界和上界 unique(a,an)-a 用于在一個范圍內刪除相鄰重…

新的 Python URL 解析漏洞可能導致命令執行攻擊

Python URL 解析函數中的一個高嚴重性安全漏洞已被披露&#xff0c;該漏洞可繞過 blocklist 實現的域或協議過濾方法&#xff0c;導致任意文件讀取和命令執行。 CERT 協調中心&#xff08;CERT/CC&#xff09;在周五的一份公告中說&#xff1a;當整個 URL 都以空白字符開頭時&…

在 docker 中快速啟動 Apache Hive

介紹 在偽分布式模式下&#xff0c;在Docker容器內運行Apache Hive&#xff0c;可以提供以下功能&#xff1a;快速啟動/調試/為Hive準備測試環境。 快速開始 1. 拉取鏡像 從DockerHub&#xff1a;https://hub.docker.com/r/apache/hive/tags中拉取鏡像。目前發布了3個鏡像&…

gitlab修改遠程倉庫地址

目錄 背景&#xff1a; 解決&#xff1a; 1.刪除本地倉庫關聯的遠程地址&#xff0c;添加新的遠程倉庫地址 2.直接修改本地倉庫關聯的遠程倉庫地址 3.打開.git隱藏文件修改遠程倉庫地址 4.拉取代碼報錯(git host key verification failed) 背景&#xff1a; 公司搬家&#…

數字圖像處理 - 圖像處理結合機器學習的應用示例

在本文中,特別關注樹葉分類機器學習技術的實現。我們的目標是演示如何利用機器學習算法來分析一系列葉子照片,從而實現準確分類并提供對植物領域有價值的算法。 圖像處理中機器學習的本質 機器學習使計算機能夠學習模式并根據視覺數據進行預測,徹底改變了圖像處理領域。在葉…

image has dependent child images

問題&#xff1a;很多none的鏡像無法被刪除 解決過程&#xff1a; 1、通過 docker image prune -f 提示可刪除為 0 2、直接進行刪除報錯&#xff1a; docker rmi 8f5116cbc201Error response from daemon: conflict: unable to delete 8f5116cbc201 (cannot be forced) - im…

銀河麒麟安裝php7.1.33

銀河麒麟V10兼容CentOS 8 安裝過程與CentOS類似。 TencentOS3.1安裝PHPNginxredis測試系統_樂大師的博客-CSDN博客 可以參考之前我寫的文章。 不過有2個細節不同&#xff0c;下面說下。 問題1&#xff1a;編譯錯誤提示“error:off_t undefined” 解決方法&#xff1a; 編…

TCP收發信息(C++)

目錄 一、介紹 二、收數據 三、發數據 一、介紹 tcp和udp的區別之一&#xff0c;即tcp是有連接的&#xff0c;udp是無連接的&#xff0c;udp收發數據的代碼可以獨立運行&#xff0c;tcp發數據前必須確保收數據的一方是打開的&#xff0c;否則無法建立連接。 二、收數據 tc…

宋浩線性代數筆記(五)矩陣的對角化

本章的知識點難度和重要程度都是線代中當之無愧的T0級&#xff0c;對于各種雜碎的知識點&#xff0c;多做題復盤才能良好的掌握&#xff0c;良好掌握的關鍵點在于&#xff1a;所謂的性質A與性質B&#xff0c;是誰推導得誰~

MyBatis的SqlSession使用步驟

對MyBatis的SqlSession理解 SqlSession是 MyBatis 框架中的一個接口&#xff0c;用于執行與數據庫相關的操作。它提供了一系列方法&#xff0c;用于查詢、插入、更新和刪除數據等數據庫操作。 SqlSession接口是通過SqlSessionFactory創建的&#xff0c;每個SqlSession實例都代…