通過文件流下載文件
如何使用 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 應用中獲取文件流,然后處理上傳的文件,將文件保存到指定目錄并返回保存的文件路徑。下面對代碼的各個部分進行簡要介紹:
-
上傳目錄設置:在這個示例中,
UPLOAD_DIR
常量用于定義上傳文件的目錄路徑。您需要將其修改為您實際希望保存上傳文件的路徑。 -
保存文件并獲取路徑:
saveFileAndGetPath
方法接收一個MultipartFile
對象,表示上傳的文件。在該方法中,將上傳的文件保存到指定的目錄中,并返回保存后的文件路徑。 -
生成文件名:
generateFileName
方法用于生成帶時間戳的新文件名,以避免文件名沖突。它使用當前時間的時間戳(精確到秒)作為文件名的一部分,并保留原始文件名的擴展名。 -
上傳邏輯:在
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地址處理文件的下載、保存和路徑轉換操作。下面對代碼的各個部分進行簡要介紹:
-
導入和日志記錄:導入了所需的類和包,使用了
@Slf4j
注解來自動生成日志記錄代碼。 -
默認路徑和方法:
defaultBaseDir
:默認的文件保存路徑,通過RuoYiConfig.getProfile()
方法獲取,您需要將其設置為實際的文件保存目錄。downloadAndSaveFile(String url, String originalFileName)
:下載文件并保存到本地,接收文件的 URL 和原始文件名作為參數。generateFileNameWithTimestamp(String originalFileName)
:根據原始文件名生成帶時間戳的新文件名。generateSavePath(String fileName)
:根據文件名生成保存的文件路徑,包括年、月、日的子目錄。convertToReturnPath(String filePath)
:將文件路徑轉換為返回的相對路徑格式。
-
下載文件邏輯:在
downloadAndSaveFile
方法中,通過創建一個 URL 連接,打開連接并獲取文件流。然后使用輸入流和輸出流將文件保存到本地指定的目錄中,生成新的文件名以避免沖突。 -
生成保存路徑:使用當前日期和時間生成保存文件的路徑,包括年、月和日的子目錄。
-
轉換返回路徑:將保存的文件路徑轉換為相對于默認路徑
/profile
的相對路徑格式。 -
獲取當前時間戳:通過
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("文件下載失敗!!!");}}