通过文件流下载文件
如何使用 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("文件下载失败!!!");}}