当前位置: 首页 > news >正文

Java文件前后端上传下载工具类

  1. 任何非压缩格式下载
package com.pisx.pd.eco.util;import java.io.*;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;import org.springframework.web.multipart.MultipartFile;import com.pisx.pd.commom.utils.FileSizeUnitTransform;
import com.pisx.pd.eco.config.FilePathConfig;import lombok.extern.slf4j.Slf4j;@Slf4j
public class FileUtils {public static String downloadFile(HttpServletResponse response, String fileName, String filePath) {InputStream inStream = null;FileInputStream fis = null;ServletOutputStream servletOs = null;try {// 文件path路径File file = new File(filePath, fileName);if (file.exists()) {response.reset();response.setContentType("application/x-msdownload");response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");int fileLength = (int)file.length();response.setContentLength(fileLength);/* 如果文件长度大于0 */if (fileLength != 0) {/* 创建输入流 */fis = new FileInputStream(file);inStream = new BufferedInputStream(fis);byte[] buf = new byte[4096];/* 创建输出流 */servletOs = response.getOutputStream();int readLength;while (((readLength = inStream.read(buf)) != -1)) {servletOs.write(buf, 0, readLength);}}return "下载成功";} else {return "文件不存在";}} catch (Exception e) {e.printStackTrace();return "下载文件出错";} finally {if (inStream != null) {try {fis.close();inStream.close();} catch (IOException e) {log.info(e.getMessage());}}if (servletOs != null) {try {servletOs.flush();servletOs.close();} catch (IOException e) {log.info(e.getMessage());}}}}public static String downloadFile(HttpServletResponse response, InputStream inputStream, String fileName) {ServletOutputStream servletOs = null;try {response.reset();response.setContentType("application/x-msdownload");response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");byte[] buf = new byte[4096];/* 创建输出流 */servletOs = response.getOutputStream();int readLength;while (((readLength = inputStream.read(buf)) != -1)) {servletOs.write(buf, 0, readLength);}return "下载成功";} catch (Exception e) {e.printStackTrace();return "下载文件出错";} finally {if (servletOs != null) {try {servletOs.flush();servletOs.close();} catch (IOException e) {log.info(e.getMessage());}}}}public static Map<String, String> uploadFile(MultipartFile file, String filePath, String fileName) {String fileUrl = filePath + fileName;// 获取文件大小String fileSize = FileSizeUnitTransform.GetFileSize(file.getSize());// 获取文件类型int index = fileName.lastIndexOf(".");// 文件格式类型String fileFormat = fileName.substring(index + 1);// 把文件以指定的名字写入指定的路径中File filed = new File(FilePathConfig.PATH + fileUrl);if (!filed.getParentFile().exists()) {boolean mkdirs = filed.getParentFile().mkdirs();if (Boolean.FALSE.equals(mkdirs)) {return Collections.emptyMap();}}try {file.transferTo(filed);} catch (Exception ex) {log.error(ex.getMessage());}Map<String, String> map = new HashMap<>(3);map.put("fileUrl", fileUrl);map.put("fileSize", fileSize);map.put("fileFormat", fileFormat);return map;}private FileUtils() {throw new IllegalStateException("Utility class");}
}
  1. 压缩包格式下载
package com.pisx.pd.eco.util;import com.pisx.pd.commom.utils.FileSizeUnitTransform;
import com.pisx.pd.datasource.lib.entity.eco.CarbonMore;
import com.pisx.pd.datasource.lib.entity.eco.MineFileDto;
import com.pisx.pd.datasource.lib.entity.eco.StatementTemplate;
import com.pisx.pd.eco.config.FilePathConfig;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Nullable;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class UploadFileUtil {static class FileContent {// 文件存储路径String fileUrl = null;// 文件真实名称String fileName = null;// 文件全路径String filePath = null;// 获取文件大小String fileSize = null;// 获取文件类型String fileFormat = null;public String getFileUrl() {return fileUrl;}public void setFileUrl(String fileUrl) {this.fileUrl = fileUrl;}public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}public String getFilePath() {return filePath;}public void setFilePath(String filePath) {this.filePath = filePath;}public String getFileSize() {return fileSize;}public void setFileSize(String fileSize) {this.fileSize = fileSize;}public String getFileFormat() {return fileFormat;}public void setFileFormat(String fileFormat) {this.fileFormat = fileFormat;}public void setExceptFileFormatName(String substring) {}}public static List<FileContent> uploadFileUtil(MultipartFile[] files, String fileUrl) {if (files != null && files.length > 0) {try {List<FileContent> list = new ArrayList<>();for (MultipartFile item : files) {FileContent f = new FileContent();// 文件真实名称f.setFileName(item.getOriginalFilename());// 获取文件大小f.setFileSize(FileSizeUnitTransform.GetFileSize(item.getSize()));// 获取文件类型int index = item.getOriginalFilename().lastIndexOf(".");// 除过文件格式名称f.setExceptFileFormatName(item.getOriginalFilename().substring(0, index));// 文件格式类型f.setFileName(item.getOriginalFilename().substring(index + 1));f.setFileUrl(fileUrl);f.setFilePath(fileUrl + item.getOriginalFilename());list.add(f);// 把文件以指定的名字写入指定的路径中File file = new File(fileUrl + item.getOriginalFilename());if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}}return list;} catch (Exception e) {e.printStackTrace();}}return null;}// 文档下载方法调用的三个静态方法public static byte[] getPackage(MineFileDto file) {byte[] bag = null;try {String filePath = file.getFile_path();bag = getBytesByFile(filePath);} catch (Exception e) {e.printStackTrace();}return bag;}// 文档下载方法调用的三个静态方法public static byte[] getPackageCarbonMore(CarbonMore file) {byte[] bag = null;try {String filePath = file.getFile_path();bag = getBytesByFile(filePath);} catch (Exception e) {e.printStackTrace();}return bag;}// 文档下载方法调用的三个静态方法public static byte[] getPackages(String filePath) {byte[] bag = null;try {bag = getBytesByFile(filePath);} catch (Exception e) {e.printStackTrace();}return bag;}@Nullableprivate static byte[] getBytesByFile(String filePath) {try {File file = new File(FilePathConfig.PATH + filePath);// 获取输入流FileInputStream fis = new FileInputStream(file);// 新的 byte 数组输出流,缓冲区容量1024byteByteArrayOutputStream bos = new ByteArrayOutputStream(1024);// 缓存byte[] b = new byte[1024];int n;while ((n = fis.read(b)) != -1) {bos.write(b, 0, n);}fis.close();// 改变为byte[]byte[] data = bos.toByteArray();bos.close();return data;} catch (Exception e) {e.printStackTrace();}return null;}public static void downloadBatchByFile(HttpServletResponse response, Map<String, byte[]> files, String zipName) {try {response.setContentType("application/x-msdownload");response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(zipName, "UTF-8"));ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());BufferedOutputStream bos = new BufferedOutputStream(zos);for (Map.Entry<String, byte[]> entry : files.entrySet()) {// 每个zip文件名String fileName = entry.getKey();// 这个zip文件的字节byte[] file = entry.getValue();BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(file));zos.putNextEntry(new ZipEntry(fileName));int len = 0;byte[] buf = new byte[10 * 1024];while ((len = bis.read(buf, 0, buf.length)) != -1) {bos.write(buf, 0, len);}bis.close();bos.flush();}bos.close();} catch (Exception e) {e.printStackTrace();}}
}

相关文章:

Java文件前后端上传下载工具类

任何非压缩格式下载 package com.pisx.pd.eco.util;import java.io.*; import java.util.Collections; import java.util.HashMap; import java.util.Map;import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse;import org.springframewo…...

内燃机可变气门驱动研究进展

Review of Advancement in Variable Valve Actuation of Internal Combustion Engines AbstractIntroduction燃烧和气体交换需要电子控制 paper Abstract 近年来&#xff0c;人们对空气污染和能源使用的日益关注导致了车辆动力总成系统的电气化。 另一方面&#xff0c;一个多世…...

NEFU离散数学实验2-容斥原理

相关概念 离散数学中的容斥原理是一种使用集合运算的技巧&#xff0c;通常用于计算两个或更多集合的并集或交集的大小。以下是一些与容斥原理相关的常见概念和公式。 概念&#xff1a; 1. 集合&#xff1a;由元素组成的对象&#xff0c;通常用大写字母表示&#xff0c;如A、B、…...

解决Windows内存溢出/占满死机问题-PoolMon工具

某一天&#xff0c; 工作所用笔记本突然越来越卡直至死机 以为只是windows11的抽风行为&#xff0c;之前就因为windows11资源管理器经常卡死&#xff08;后升级小版本好多了&#xff09;。 遂长按电源键强制关机重启。 然慢慢又越来越卡&#xff0c;直至卡死&#xff0c;无…...

【ROS】ros-noetic和anaconda联合使用【教程】

【ROS】ros-noetic和anaconda联合使用【教程】 文章目录 【ROS】ros-noetic和anaconda联合使用【教程】1. 安装anaconda2. 创建虚拟环境3. 查看python解释器路径4. 在虚拟环境中使用任意的包5. 创建工作空间和ros功能包进行测试Reference 1. 安装anaconda 在Ubuntu20.04中安装…...

自动化RPA开发 --获取所有窗口信息和进程信息

场景 准备做一个RPA工具&#xff0c;可以从桌面和浏览器选择元素&#xff0c;获取窗口信息和进程信息是必要的&#xff0c;因为获取了窗口信息和进程&#xff0c;可用对程序做一些想要的操作。 coding 工具类 /*** Windows系统工具类*/ public class WinOsUtils {static fi…...

【Qt之布局】QVBoxLayout、QHBoxLayout、QGridLayout、QFormLayout介绍及使用

在Qt中&#xff0c;布局管理器&#xff08;Layout&#xff09;用于管理窗口中的控件的位置和大小&#xff0c;以适应不同大小的窗口。 常用的布局管理器包括QVBoxLayout、QHBoxLayout、QGridLayout和QFormLayout。 先放张布局UI&#xff1a; 1. QVBoxLayout&#xff08;垂直布…...

【计算机毕业设计】python在线课程培训学习考试系统637r7-PyCharm项目

使用说明 使用Navicat或者其它工具&#xff0c;在mysql中创建对应名称的数据库&#xff0c;并导入项目的sql文件&#xff1b; 使用PyCharm 导入项目&#xff0c;修改配置&#xff0c;运行项目&#xff1b; 将项目中config.ini配置文件中的数据库配置改为自己的配置&#xff0c;…...

vue3后台管理系统之登录界面和业务的实现

1.静态页面的搭建 <template><div class"login_container"><el-row><el-col :span"12" :xs"0" /><el-col :span"12" :xs"24"><!-- 登录的表单 --><el-form ref"loginForms&qu…...

GEE19:基于Landsat8的常见的植被指数逐年获取

植被指数逐年获取 1. 常见的植被指数1.1 比值植被指数&#xff08;Ratio vegetation index&#xff0c;RVI&#xff09;1.2 归一化植被指数&#xff08;Normalized Difference Vegetation Index&#xff0c;NDVI&#xff09;1.3 增强植被指数&#xff08;Enhanced Vegetation I…...

Python【多分支实际应用的练习】

要求:某商店T恤的价格为35元/件&#xff08;2件9折&#xff0c;3件以上8折&#xff09;,裤子的价格为120 元/条&#xff08;2条以上9折&#xff09;小明在该店买了3件T恤和2条裤子,请计算并显示小明应该付多少钱? 代码如下&#xff1a; tshirt_price 35 # T恤的单价 pan…...

LeetCode 343. 整数拆分(动态规划)

LeetCode 343. 整数拆分 思路&#xff1a; 通过题目我们可以知道&#xff0c;一个正整数最少拆成2个数&#xff0c;最多拆成n个数&#xff0c;即可拆分的个数为2&#xff5e;n 若将拆除的第一个正整数令为k&#xff0c;那么剩下的数则为n-k&#xff0c;此时可以不拆分&#x…...

C++对象模型(12)-- 构造函数语义学:构造函数

1、默认构造函数生成规则 编译器不一定会为类生成默认构造函数&#xff0c;但在下列情况下&#xff0c;编译器会生成默认构造函数。 &#xff08;1&#xff09;该类没有任何构造函数&#xff0c;但包含一个类类型的成员变量&#xff0c;且成员变量所属的类有默认构造函数。 …...

[23] T^3Bench: Benchmarking Current Progress in Text-to-3D Generation

3D生成蓬勃发展&#xff0c;主流方法通过事例比较和用户调查来评价方法好坏&#xff0c;缺少客观比较指标&#xff1b;本文提出Bench&#xff0c;首次综合比较了不同生成方法&#xff1b;具体来说&#xff0c;本文设计了质量评估&#xff08;Quality Assessment&#xff09;和对…...

linux系统如何定时关机

立刻关机 poweroff 10分钟后自动关机 shutdown -h 10 如果希望终止上面执行的10分钟关机&#xff0c;则执行&#xff1a; shutdown -c 希望在22:00关闭计算机 shutdown -h 22:00...

构建高性能物联网数据平台:EMQX和CnosDB的完整教程

CnosDB 是一款高性能、高压缩率、高易用性的开源分布式时序数据库。主要应用场景为物联网、工业互联网、车联网和IT运维。所有代码均已在GitHub开源。本文将介绍如何使用EMQX 这一MQTT 服务器 CnosDB 构建物联网数据平台&#xff0c;实现物联网数据的实时流处理。 前言 在物联…...

【vim 学习系列文章 11 -- vim filetype | execute | runtimepath 详细介绍】

文章目录 filetype plugin indent on 什么功能&#xff1f;vim runtimepath 详细介绍vim 中 execute 命令详细介绍execute pathogen#infect() 详细介绍 filetype plugin indent on 什么功能&#xff1f; 在网上我们经常可以看到vimrc配置中有 filetype plugin indent on 这个配…...

[备忘]WindowsLinux上查看端口被什么进程占用|端口占用

Windows上 查看端口占用&#xff1a; netstat -aon|findstr <端口号> 通过进程ID查询进程信息 tasklist | findstr <上一步查出来的进程号> 图例&#xff1a; Linux 上 查看端口占用&#xff1a; netstat -tuln | grep <端口号> lsof -i:<端口号&…...

函数的扩展

文章目录 函数的扩展1.函数参数的默认值1.1 基本用法-- 参数变量是默认声明的&#xff0c;所以不能用 let或const 再次声明-- 使用参数默认值时&#xff0c;函数不能有同名参数1.2 与解构赋值默认值结合使用☆☆☆ 函数参数的默认值生效以后&#xff0c;参数解构赋值依然会进行…...

Cypress安装使用

node.js 安装使用Cypress总是会看见node.js&#xff0c;那就先看看node.js是什么。JavaScript以前运行需要在浏览器中&#xff08;浏览器内置解释器&#xff09;&#xff0c;通过node.js框架内置v8引擎&#xff08;也就是可以执行js脚本所需的工具&#xff09;&#xff0c;这样…...

如何通过AI技术提升图表创作效率?Next AI Draw.io全攻略

如何通过AI技术提升图表创作效率&#xff1f;Next AI Draw.io全攻略 【免费下载链接】next-ai-draw-io 项目地址: https://gitcode.com/GitHub_Trending/ne/next-ai-draw-io 技术人员日常工作中常会遇到这样的困境&#xff1a;花几小时绘制的架构图需要频繁修改&#x…...

项目介绍 MATLAB实现基于Q-learning-DNN Q学习算法(Q-learning)结合深度神经网络(DNN)进行无人机三维路径规划的详细项目实例(含模型描述及部分示例代码) 还请多多点一下

MATLAB实现基于Q-learning-DNN Q学习算法&#xff08;Q-learning&#xff09;结合深度神经网络&#xff08;DNN&#xff09;进行无人机三维路径规划的详细项目实例 更多详细内容可直接联系博主本人 或者访问对应标题的完整博客或者文档下载页面&#xff08;含完整的程序&…...

从逐点更新到批量优化:深入解析分块LMS(BLMS)自适应滤波算法

1. 从逐点到分块&#xff1a;为什么需要BLMS算法&#xff1f; 第一次接触自适应滤波时&#xff0c;我和大多数人一样从经典的LMS算法开始。当时在做一个语音去噪的小项目&#xff0c;用LMS实现实时滤波后发现两个头疼的问题&#xff1a;电脑风扇狂转不止&#xff08;计算负荷大…...

逆向分析实战:从IDA反编译看bjdctf_2020_babystack的栈溢出漏洞成因与利用

逆向工程实战&#xff1a;bjdctf_2020_babystack栈溢出漏洞的深度解析 在二进制安全领域&#xff0c;栈溢出漏洞始终是攻防对抗的经典课题。今天我们将以bjdctf_2020_babystack这道CTF题目为案例&#xff0c;通过IDA Pro的静态分析视角&#xff0c;完整还原从漏洞发现到利用的…...

Harmonyos应用实例232:蒙特卡洛圆周率计算 (统计与概率)

4. 蒙特卡洛圆周率计算 (统计与概率) 功能介绍: 利用蒙特卡洛方法模拟计算 π\piπ 值。屏幕上显示一个正方形和内切圆,系统随机向正方形内“撒豆子”,通过统计落在圆内和圆外的点数比例来估算圆周率。实时更新计算结果和误差,生动演示概率统计在数学计算中的应用。 // …...

RIME输入法词库改造指南:让你的THUOCL词库同时支持简体和港台繁体

RIME输入法词库改造指南&#xff1a;让你的THUOCL词库同时支持简体和港台繁体 在中文输入法的世界里&#xff0c;RIME以其高度可定制性赢得了技术爱好者的青睐。但当我们面对不同地区的中文用户时&#xff0c;一个棘手的现实问题浮现&#xff1a;如何让单一词库同时满足大陆简…...

突破难关:AI专著撰写工具应用技巧,助你快速著书立说

学术专著写作困境与AI工具的崛起 对许多研究人员来说&#xff0c;撰写学术专著最大的挑战&#xff0c;就是“有限的精力”与“无尽的需求”之间的矛盾。专著的写作过程通常需要三到五年&#xff0c;甚至更长的时间&#xff0c;而研究者们在日常工作中还要应对教学、研究项目和…...

IndexTTS-2-LLM优化指南:提升合成速度与音频质量的技巧

IndexTTS-2-LLM优化指南&#xff1a;提升合成速度与音频质量的技巧 当你第一次使用IndexTTS-2-LLM生成语音时&#xff0c;可能会被它自然流畅的效果所吸引。但用了一段时间后&#xff0c;你可能会发现两个问题&#xff1a;生成一段稍长的文本需要等待好几秒&#xff0c;或者在…...

从机械臂精度控制到模型防过拟合:工程师视角下的‘无穷范数’实用指南

从机械臂精度控制到模型防过拟合&#xff1a;工程师视角下的‘无穷范数’实用指南 在工业自动化和机器学习领域&#xff0c;工程师们常常面临一个共同挑战&#xff1a;如何有效控制系统中的"最坏情况"。无论是机械臂关节的极限误差&#xff0c;还是神经网络对抗样本…...

查重率亮红灯反复修改,有哪些真正闭眼可入的的AI智能降重工具推荐?

毕业论文降重&#xff0c;核心在于语义优化 去AI痕迹 降低查重率&#xff0c;工具选择直接影响修改效率。推荐免费与付费工具结合使用&#xff0c;既能节省成本又保证效果。下面按中文、英文、免费/付费分类整理&#xff0c;附上实测效果与适用场景。 一、中文论文降重工具&a…...