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.hqwc.cn/news/68392.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

laravel框架中批量更新数据

在php框架中 tp中就有批量更新封装好的 SaveAll 在laravel中有批量插入没有批量更新操作;因此我们可以自己去封装一个 然后批量进行更新操作 封装参考代码: /*** 批量更新** param $tableName 表名称* param string $pk 更新的字段* param array $multipleData 要更新的数据*…

多智能体共识算法的粗略数学证明

这篇文章是对论文《Consensus and Cooperation in Networked Multi-Agent Systems》中定理一的粗略数学证明。 论文中的定理一: 对一个由 n 个智能体以拓扑结构 G 组成的网络,使用以下共识算法: x ˙ i ( t ) Σ j ∈ N i a i j ( x j ( t…

【BEV】3D视觉 PRELIMINARY

这里的知识来自于论文 Delving into the Devils of Bird’s-eye-view Perception: A Review, Evaluation and Recipe 的 Appendix B.1 部分来自 这篇文章 从透视图转向鸟瞰图。(Xw、Yw、Zw)、(Xc、Yc、Zc)表示世界World坐标和相…

React - useEffect函数的理解和使用

文章目录 一,useEffect描述二,它的执行时机三,useEffect分情况使用1,不写第二个参数 说明监测所有state,其中一个变化就会触发此函数2,第二个参数如果是[]空数组,说明谁也不监测3,第…

Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法

Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法 目录 Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法一、问题描述二、解决方法1.打开 WORD 2019,点击菜单中的“文件”;…

无服务器架构发布啦!

导读Serverless 1.15.2 已发布。The Serverless Framework (无服务器架构)允许你自动扩展、按执行付费、将事件驱动的功能部署到任何云。 目前支持 AWS Lambda、Apache OpenWhisk、Microsoft Azure,并且正在扩展以支持其他云提供商。 Serverless 降低了…

iOS-砸壳篇(两种砸壳方式)

CrackerXI砸壳呢,当时你要是使用 frida-ios-dump 也是可以的; https://github.com/AloneMonkey/frida-ios-dump frida-ios-dump: 代码中需要更改的:手机中的内网ip 密码 等 最后放到我的砸壳路径里: python dump.py -l查看应用…

uniapp 自定义手机顶部状态栏不生效问题

想要的效果想淘宝一样,底色覆盖到手机顶部,找了两天都没找到原因,过程很艰苦,直接上结果吧 项目是后来接手的,最终原因出在这, "immersed" : false>设置为 true 就可以了,沉浸式样…

每日一题——合并二叉树

题目 已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如: 两颗二叉树是: Tree 1 Tree 2 合并后的树为 数据范围:树上节点数…

【1572. 矩阵对角线元素的和】

来源:力扣(LeetCode) 描述: 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1: 输入:mat [[1,2,3]…

docker基本使用方法

docker使用 1. Docker 介绍 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。通过利用 …

pytorch单机多卡后台运行

nohup sh ./train_chat.sh > train_chat20230814.log 2>1&参考资料 Pytorch单机多卡后台运行的解决办法