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.mzph.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 填写项目基本…

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检测工具: 五、修复建议 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损…

新的 Python URL 解析漏洞可能导致命令执行攻击

Python URL 解析函数中的一个高严重性安全漏洞已被披露,该漏洞可绕过 blocklist 实现的域或协议过滤方法,导致任意文件读取和命令执行。 CERT 协调中心(CERT/CC)在周五的一份公告中说:当整个 URL 都以空白字符开头时&…

gitlab修改远程仓库地址

目录 背景: 解决: 1.删除本地仓库关联的远程地址,添加新的远程仓库地址 2.直接修改本地仓库关联的远程仓库地址 3.打开.git隐藏文件修改远程仓库地址 4.拉取代码报错(git host key verification failed) 背景: 公司搬家&#…

image has dependent child images

问题:很多none的镜像无法被删除 解决过程: 1、通过 docker image prune -f 提示可删除为 0 2、直接进行删除报错: 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个细节不同,下面说下。 问题1:编译错误提示“error:off_t undefined” 解决方法: 编…

宋浩线性代数笔记(五)矩阵的对角化

本章的知识点难度和重要程度都是线代中当之无愧的T0级,对于各种杂碎的知识点,多做题复盘才能良好的掌握,良好掌握的关键点在于:所谓的性质A与性质B,是谁推导得谁~

Ubuntu22.04复现SHADEWACHER(手动安你就慢了)

因为我是打算跑TC数据集,所以跳过audit安装。 我的Ubuntu使用的是清华源。 1. Parser Setup 1.1 g apt install g1.2 neo4j Ubuntu22.04换什么源都会导致无法定位软件包,添加neo4j的官方源又会导致不信任的源。 22.04以下的版本,直接用命…

MySQL 根据多字段查询重复数据

MySQL 根据多字段查询重复数据 在实际的数据库应用中,我们经常需要根据多个字段来查询重复的数据。MySQL 提供了一些方法来实现这个功能,让我们能够快速准确地找到和处理重复数据。本文将介绍如何使用 MySQL 来根据多字段查询重复数据,并提供…

SIFT 算法 | 如何在 Python 中使用 SIFT 进行图像匹配

介绍 人类通过记忆和理解来识别物体、人和图像。你看到某件事的次数越多,你就越容易记住它。此外,每当一个图像在你的脑海中弹出时,它就会将该项目或图像与一堆相关的图像或事物联系起来。如果我告诉你我们可以使用一种称为 SIFT 算法的技术来教机器做同样的事情呢? 尽管…

C语言——动态内存函数(malloc、calloc、realloc、free)

了解动态内存函数 前言:一、malloc函数二、calloc函数三、realloc函数四、free函数 前言: 在C语言中,动态内存函数是块重要的知识点。以往,我们开辟空间都是固定得,数组编译结束后就不能继续给它开辟空间了&#xff0…

贴吧照片和酷狗音乐简单爬取

爬取的基本步骤 很简单,主要是两大步 向url发起请求 这里注意找准对应资源的url,如果对应资源不让程序代码访问,这里可以伪装成浏览器发起请求。 解析上一步返回的源代码,从中提取想要的资源 这里解析看具体情况,一…

浅谈现代医院手术室IT供配电系统的设计与研究

安科瑞 华楠 [摘要] 随着人们的生活水平的不断提高,医疗条件的不断改善,人们对健康越来越重视同时对医疗条件的要求也越来越高,对医院手术室医疗设施提出了新的要求。以往医院普通手术室状况已不能满足人们的要求&…