当前位置: 首页 > 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;这样…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...