java常用的上传下载工具类

在日常开发过程中,文件的上传下载是最常用的功能,通常我们需要把文件上传到某个特定的影像平台,由平台统一管理文件,当我们需要时,则从平台下载

文件上传

1.上传到本地指定路径 file.transferTo()
2.hutool中的HttpUtil上传到指定的url

@Slf4j
public class UploadUtil{/*** 上传方式一* 上传到指定路径* @param file 上传的文件* @param savePath保存的路径*/public static File uploadToPath(MultipartFile file, String savePath) throws Exception {if(file == null) {throw new Exception("未找到上传文件!");}if(savePath == null || "".equals(savePath.trim())) {throw new Exception("上传文件失败:未找到文件存放路径!");}String fileName = file.getOriginalFilename();//创建存放目录File saveFiles=new File(savePath);if(!saveFiles.exists()){saveFiles.mkdirs();//创建文件夹,如果上级目录不存在,则挨个创建目录}//指定需要保存的文件名称和路径File saveFile = FileUtil.newFile(savePath + File.separator + fileName);try {file.transferTo(saveFile);//保存文件到指定目录//FileUtil.writeBytes(file.getBytes(), saveFile);} catch (Exception e) {log.error("文件保存到临时目录失败!" + e.getMessage());}return saveFile;}/*** 上传方式二* 上传到指定url* @param multipartFiles 需要上传的文件* @param baseUrl 上传的远程地址*/public static JSONObject uploadByUrl(MultipartFile[] multipartFiles,String baseUrl) throws Exception {if (multipartFiles == null || multipartFiles.length == 0) {throw new Exception("未选择文件");}// MultiResource 多资源组合资源 此资源为一个利用游标自循环资源,只有调用next() 方法才会获取下一个资源,使用完毕后调用reset()方法重置游标MultiResource multiResource = new MultiResource(Arrays.stream(multipartFiles).map(multipartFile -> {try {return new InputStreamResource(multipartFile.getInputStream(), multipartFile.getOriginalFilename());} catch (Exception ex) {//  log.error("读取io流异常", ex);throw new SystemException("读取io流异常!");}}).collect(Collectors.toList()));HttpResponse execute = HttpRequest.post(baseUrl + "/uploadFiles/").form("files", multiResource).execute();return JSONObject.parseObject(execute.body());}}

两种方式的文件下载

根据影像平台url下载并实时返回给前端,也可以通过配置在代码中的文件路径去下载
另外hutool的HttpUtil工具类有下载文件的方法downloadFile、downloadFileFromUrl等

@Slf4j
public class FileUtils{/*** 下载方式一* 根据影像地址下载文件* @param downloadUrl 下载地址* @param fileName    文件名* @param response   包含返回给前端的影像内容*/public static void downloadByUrl(String downloadUrl, String fileName, HttpServletResponse response) {log.info("文件目标下载地址:[{}], 文件名称:[{}]", downloadUrl, fileName);InputStream input = null;OutputStream output = null;try {output = response.getOutputStream();//写入影像URL url = new URL(downloadUrl);URLConnection urlConn = url.openConnection();urlConn.setDoInput(true);input = urlConn.getInputStream();//根据地址读取影像文件response.reset();fileName = URLEncoder.encode(fileName, "UTF-8");response.setHeader("Content-disposition", "attachment; filename=" + transferToNormal(fileName));response.setContentType("application/octet-stream");byte[] b = new byte[1024];int len = 0;while ((len = input.read(b)) > 0) {output.write(b, 0, len);}output.flush();} catch (Exception e) {log.error("从影像平台下载文件失败,信息:{}", e.getMessage());} finally {try {if (input != null) {input.close();}if (output != null) {output.close();}} catch (IOException e) {log.error("io流关闭异常,信息:{}", e.getMessage());}}}/*** 下载方式二* 从文件路径下载* @param filePath 请求的路径* @param response   包含返回给前端的影像内容*/public static void downloadByPath(String filePath, HttpServletResponse response) {//FileUtil是hutool的文件工具类File newfile =FileUtil.newFile(filePath);if (!newfile.exists()) {throw new Exception("没有找到要下载的文件,请检查文件路径!");}//取得文件名String fileName = newfile.getName();InputStream fis = null;OutputStream out = null;try {fis = new FileInputStream(newfile);out = response.getOutputStream();response.reset();response.setCharacterEncoding("UTF-8");response.setContentType("application/force-download");// 设置强制下载不打开response.addHeader("Content-Disposition","attachment;filename=" + new String(fileName.getBytes("utf-8"), "iso8859-1"));response.setHeader("Content-Length", String.valueOf(newfile.length()));byte[] b = new byte[1024];int len;while ((len = fis.read(b)) != -1) {out.write(b, 0, len);}out.flush();} catch (Exception e) {log.info("从文件路径下载文件失败,异常信息:{}", e.getMessage());} finally {try {if (fis != null) {fis.close();}if (out != null) {out.close();}} catch (IOException e) {log.info("close异常!异常信息:{}", e.getMessage());}}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/726625.shtml

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

相关文章

构建高效Web服务:深入理解RESTful架构与实践指南

RESTful(Representational State Transfer,表现层状态转移)是一种软件架构风格,它定义了一组约束和原则,用于创建Web服务。RESTful架构的核心思想是将网络应用分解为独立的资源,每个资源都有一个唯一的标识…

Matter 笔记2-OT-BR-POSIX编译配置

1. 代码 git clone https://github.com/openthread/ot-br-posix2. 环境准备 配置参考:GitHub cd ot-br-posix默认: ./script/bootstrap带网络管理器的如下配置: NETWORK_MANAGER1 NETWORK_MANAGER_WIFI1 ./script/bootstrap硬件固件准备…

SQL 注入攻击 - cookie base64编码注入

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、Base64编码介绍 原理 Base64编码的原理是将三个字节的二进制数据(共24位)转换成四个ASCII字符。由于每个ASCII字符可以表示64种状态(2^6),刚好可以用来表示24位二进制数…

java-springboot 源码 01

01.springboot 是一个启动器 先安装maven&#xff0c;按照网上的流程来。主要是安装完成后&#xff0c;要修改conf目录下的setting.xml文件。 添加&#xff1a;阿里云镜像 <mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>ali…

【vue3之Pinia:状态管理工具】

Pinia:状态管理工具 一、认识Pinia二、定义store三、gettters四、Action1.定义普通函数2.异步实现 五、storeToRefs工具函数六、pinia持久化插件1. 安装插件2. main.js 使用3. 开启4.其他配置 一、认识Pinia Pinia 是 Vue 的最新 状态管理工具 &#xff0c;是 Vuex 的 替代品 …

OpenCV 视频处理(关于摄像头和视频文件的读取、显示、保存等等)

1、前言 OpenCV不仅能够处理图像&#xff0c;还能够处理视频 视频是由大量的图像构成的&#xff0c;这些图像是以固定的时间间隔从视频中获取的。这样&#xff0c;就能够使用图像处理的方法对这些图像进行处理&#xff0c;进而达到处理视频的目的。要想处理视频&#xff0c;需…

【 Go】GoFrame 框架下执行 SQL 语句并获取结果

在 GoFrame 框架中&#xff0c;可以使用db包来执行 SQL 语句并获取结果。以下是一个简单的示例代码&#xff0c;演示如何在 GoFrame 中调用一个 SQL 语句并获取结果&#xff1a; package mainimport ("fmt""github.com/gogf/gf/frame/g" )func main() {//…

PCL官方demo的编译使用教程

写在前面 本文内容 PCL官方demo的编译使用教程&#xff1b; 后续对PCL demo中比较常用的算法、应用demo会出专门的博客讲解、拓展&#xff1b; 更多点云基础、算法相关内容请关注专栏&#xff1a; 点云处理基础 点云配准(PointCloud Registration) Open3D点云处理 PCL点云处理 …

boost.redis崩溃的解决方法

使用boost.redis的协程一定要co_spawn在strand对象中。 正确的用法&#xff1a; boost::asio::co_spawn(boost::dasio::make_strand(ioc),XXXCoroutine(),boost::asio::detached ); 错误的用法&#xff1a; boost::asio::co_spawn(ioc,XXXCoroutine(),boost::asio::detache…

极狐GitLab 16.3 重磅发布,极致的 DevOps 体验等你来【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 极狐GitLab 在去年 8 月份发布了 16.3 版本。此次发布带来了价…

Python程序设计通常涵盖以下主题:

Python程序设计通常涵盖以下主题&#xff1a; 基础语法&#xff1a;包括变量、数据类型&#xff08;如整数、浮点数、字符串、列表、元组、字典等&#xff09;、条件语句、循环语句等。 函数&#xff1a;如何定义函数、传递参数、返回值等。 模块和包&#xff1a;如何导入和使…

【Office】Word、Excel 和 PowerPoint 中常用的一些快捷键

以下是 Microsoft Word、Excel 和 PowerPoint 的全部常用快捷键&#xff1a; Microsoft Word 快捷键&#xff1a; 常用快捷键&#xff1a; 新建文档&#xff1a;Ctrl N打开文档&#xff1a;Ctrl O保存文档&#xff1a;Ctrl S复制&#xff1a;Ctrl C粘贴&#xff1a;Ctrl …

Docker本地部署Redis容器结合内网穿透实现无公网ip远程连接

文章目录 前言1. 安装Docker步骤2. 使用docker拉取redis镜像3. 启动redis容器4. 本地连接测试4.1 安装redis图形化界面工具4.2 使用RDM连接测试 5. 公网远程访问本地redis5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Ub…

代码随想录算法训练营第23天

509. 斐波那契数 class Solution:def fib(self, n: int) -> int:if n 1:return 1if n 0:return 0 dp [0]*(n1)dp[1] 1for i in range(2,n1):dp[i] dp[i-1] dp[i-2]return dp[-1] 70. 爬楼梯 class Solution:def climbStairs(self, n: int) -> int:dp [0] * (n1)i…

Python与FPGA——局部二值化

文章目录 前言一、局部二值化二、Python局部二值化三、FPGA局部二值化总结 前言 局部二值化较全局二值化难&#xff0c;我们将在此实现Python与FPGA的局部二值化处理。 一、局部二值化 局部二值化就是使用一个窗口&#xff0c;在图像上进行扫描&#xff0c;每扫出9个像素求平均…

探索AI视频创新:Sora的奇迹

探索AI视频创新&#xff1a;Sora的奇迹 随着科技的不断演进&#xff0c;AI视频模型已经成为人工智能领域的一颗新星。在这场技术的风暴中&#xff0c;OpenAI的Sora模型以其杰出的性能和前瞻性的技术脱颖而出&#xff0c;正引领着AI视频领域的全新创新浪潮。 Sora的技术之光 …

【深度学习笔记】优化算法——小批量随机梯度下降

小批量随机梯度下降 到目前为止&#xff0c;我们在基于梯度的学习方法中遇到了两个极端情况&#xff1a; :numref:sec_gd中使用完整数据集来计算梯度并更新参数&#xff0c; :numref:sec_sgd中一次处理一个训练样本来取得进展。 二者各有利弊&#xff1a;每当数据非常相似时&a…

电脑蓝牙在哪里打开?不同系统详解

在现代计算机的多功能性中&#xff0c;蓝牙技术的广泛应用使得我们能够轻松连接各种外部设备&#xff0c;实现无线传输和分享。无论是连接无线耳机、键盘&#xff0c;还是与其他设备快速交换文件&#xff0c;蓝牙在电脑中的角色很重要。然而&#xff0c;对于一些用户而言&#…

centos7 使用rpm包部署filebeat

先决条件参考 虚拟机部署elasticsearch集群-CSDN博客 下载并安装filebeat的rpm包 curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.18-x86_64.rpmrpm -vi filebeat-7.17.18-x86_64.rpm 修改配置文件 配置文件内容可以参考 Repositories…

5G工业网关是什么?

随着科技的飞速发展&#xff0c;5G技术已经逐渐渗透到我们生活的方方面面。而在工业领域&#xff0c;5G工业网关作为连接工业设备与网络的关键组件&#xff0c;正发挥着越来越重要的作用。HiWoo Box其5G工业网关产品以其卓越的性能和稳定性&#xff0c;正助力企业实现数字化转型…