分享一个FileUtil工具类,基本满足web开发中的文件上传,单个文件下载,多个文件下载的需求
获取该FileUtil工具类具体演示,公众号内回复fileutil20200501即可。
package com.example.demo.util; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.*;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; public class FileUtil { //设置压缩包临时文件目录
public static String zip_temp="D:\\java\\zip_temp"; /**
* 上传文件操作
* @param filePath 文件目录 parentPath/fileName
* @param inputStream 文件输入流
* @throws IOException
*/
public static void uploadFile(String filePath, InputStream inputStream) {
// 获取文件的后缀格式
// String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();
File destFile = new File(filePath);
// 生成父级目录
if (!destFile.getParentFile().exists()) {
destFile.getParentFile().mkdirs();
}
try {
// 文件存储操作
BufferedInputStream in=new BufferedInputStream(inputStream);
BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream(destFile));
int len=-1;
byte[] b=new byte[1024];
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
// 关闭相关流
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 下载单个文件
* @param fileName 文件名
* @param filePath 文件路径
* @param response 响应
* @return
*/
public static void downloadFile(String fileName,String filePath, HttpServletResponse response) throws Exception {
//创建该文件对象
File file = new File(filePath);
//判断该文件是否存在
if (file.exists()){//存在
try {
// 获取文件名
fileName = new String(fileName.getBytes(),"iso-8859-1");
// 设置响应头
response.setContentType("application/force-download");
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
// 把文件按照字节放入响应体中
byte[] buffer = new byte[1024];
FileInputStream fis = null; //文件输入流
BufferedInputStream bis = null;
OutputStream os = null; //输出流
os = response.getOutputStream();
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
int i = bis.read(buffer);
while(i != -1){
os.write(buffer);
i = bis.read(buffer);
}
// 关闭相关流
bis.close();
fis.close();
}catch (Exception e){
e.printStackTrace();
throw new Exception("文件下载出错!");
}
}else {//不存在
throw new Exception("该文件不存在"+fileName);
}
} /**
* 下载多个文件,将多个文件打包成压缩包,将压缩包进行下载
* @param fileList 就是把多个文件的路径放到一个list里面
* @param response 响应
* @param zipFileName 压缩包名字
* @return
* @throws Exception
*/
public static void downLoadFiles(String zipFileName, List<File> fileList, HttpServletResponse response) throws Exception {
try {
// 创建一个临时压缩文件,存放临时文件,方法最后有删除临时文件的步骤
String path = FileUtil.zip_temp+File.separator + "zips" +File.separator +zipFileName+".zip";
File zipFile = new File(path);
if (!zipFile.getParentFile().exists()) {
zipFile.getParentFile().mkdirs();
}
// 创建文件输出流
FileOutputStream fous = new FileOutputStream(zipFile);
ZipOutputStream zipOut = new ZipOutputStream(fous);
//向zip文件中添加原始文件
for (File file: fileList){
zipFile(file,zipOut);
}
// 关闭相关流
zipOut.close();
fous.close();
// 清空response
response.reset();
// 下载单个文件的操作
FileUtil.downloadFile(zipFile.getName(),zipFile.getPath(),response);
// 删除临时文件
zipFile.delete();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 根据输入的文件与输出流对文件进行打包
* @param file 当个文件
* @param zipOut 压缩包输出流
*/
private static void zipFile(File file, ZipOutputStream zipOut) throws Exception {
try {
if (file.exists()) {
FileInputStream IN = new FileInputStream(file);
BufferedInputStream bins = new BufferedInputStream(IN, 1024);
ZipEntry entry = new ZipEntry(file.getName());
zipOut.putNextEntry(entry);
// 向压缩文件中输出数据
int nNumber;
byte[] buffer = new byte[1024];
while ((nNumber = bins.read(buffer)) != -1) {
zipOut.write(buffer, 0, nNumber);
}
// 关闭创建的流对象
bins.close();
IN.close();
}
} catch (Exception e) {
e.printStackTrace();
throw new Exception("压缩包某个文件添加异常!");
}
}
}
===API
1.文件上传方法
uploadFile(String filePath, InputStream inputStream);
参数解释
filePath:上传文件存储的路径
inputStream:上传文件的文件输入流,从MultipartFile对象中,通过getInputStream();方法即可获取。
2.单个文件下载方法
downloadFile(String fileName,String filePath, HttpServletResponse response) throws Exception
参数解释
fileName:下载后文件的文件名
filePath:下载文件在服务器的路径位置
response:响应体
3.多个文件下载方法
downLoadFiles(String zipFileName, List<File> fileList, HttpServletResponse response) throws Exception
参数解释
zipFileName:下载后压缩包的文件名
fileList:多个文件组成的集合
response:响应体
分享一个FileUtil工具类,基本满足web开发中的文件上传,单个文件下载,多个文件下载的需求的更多相关文章
- 详细阐述Web开发中的图片上传问题
Web开发中,图片上传是一种极其常见的功能.但是呢,每次做上传,都花费了不少时间. 一个"小功能"花费我这么多时间,真心不愉快. So,要得认真分析下原因. 1.在最初学习Java ...
- Web开发安全之文件上传安全
很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...
- 分享一个Snackbar工具类 SnackbarUtils;
分享一个Snackbar工具类,源代码也是在Github上面找的,自己做了一下修改: 功能如下: 1:设置Snackbar显示时间长短 1.1:Snackbar.LEN ...
- ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件
前言: 从开始学习Vue到使用element-ui-admin已经有将近快两年的时间了,在之前的开发中使用element-ui上传组件el-upload都是直接使用文件选取后立即选择上传,今天刚好做了 ...
- [红日安全]Web安全Day5 - 任意文件上传实战攻防
本文由红日安全成员: MisakiKata 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目 ...
- Web应用安全之文件上传漏洞详解
什么是文件上传漏洞 文件上传漏洞是在用户上传了一个可执行的脚本文件,本通过此脚本文件获得了执行服务器端命令的功能,这种攻击方式是最为直接,最为有效的,有时候,几乎没有什么门槛,也就是任何人都可以进行这 ...
- 基于HT for Web矢量实现HTML5文件上传进度条
在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...
- 百度Web Uploader组件实现文件上传(一)
Web Uploader WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势 ...
- JAVA WEB怎么实现大文件上传
javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 改进后的代码不需要form标签,直 ...
随机推荐
- 1-Numpy的通用函数(ufunc)
一.numpy“通用函数”(ufunc)包括以下几种: 元素级函数(一元函数):对数组中的每个元素进行运算 数组级函数:统计函数,像聚合函数(例如:求和.求平均) 矩阵运算 随机生成函数 常用一元通用 ...
- 数据结构C语言实现----直接插入排序
直接插入排序(简单插入排序) 给定一个数字串:2 6 7 8 9 3 2 3 4 按从小到大的顺序排列输出 首先把第一个数字放到一个小组里:(2)6 7 8 9 3 2 3 4 让后从第二个数字开始往 ...
- Skill 脚本演示 ycChangeViaNumber.il
https://www.cnblogs.com/yeungchie/ ycChangeViaNumber.il 使用鼠标滚轮快速修改 Via 的数量. 回到目录
- luogu CF125E MST Company wqs二分 构造
LINK:CF125E MST Company 难点在于构造 前面说到了求最小值 可以二分出斜率k然后进行\(Kruskal\) 然后可以得到最小值.\(mx\)为值域. 得到最小值之后还有一个构造问 ...
- 2019 HL SC day2
今天讲的是网络流 大部分题目都写过了 这里 就总结一番. bzoj 1066 裸的最大流 不过需要拆点细节方面有一点坑 剩下的 没什么了. //#include<bits/stdc++.h> ...
- OpenVINO学习系列1
OpenVINO介绍 OpenVINO是英特尔推出一套基于深度学习的计算机视觉加速优化框架,支持其它机器学习平台模型的压缩优化.加速计算等功能. 自发布以后就得到开发者的青睐,其强大的模型优化与压缩能 ...
- Python自动化运维 技术与最佳实践PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书
点击获取提取码:7bl4 一.内容简介 <python自动化运维:技术与最佳实践>一书在中国运维领域将有"划时代"的重要意义:一方面,这是国内第一本从纵.深和实践角度探 ...
- LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci 题解
题目传送门 如果之前推过斐波那契数列前缀和就更好做(所以题目中给出了). 斐波那契数列前缀和题目链接 先来推一下斐波那契数列前缀和: \[\sum\limits_{i=1}^nf(i) \] 其中 \ ...
- LeetCode(2)---路径总和
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = ...
- vue中一些常见的面试题
前言 一位正在学习前端的菜鸟,虽菜,但还未放弃. 内容 1,说一下vue中的指令 答: ①,v-html:主要用来渲染html节点,其作用与原生的innerHtml基本一致 ②,v-text:主要用来 ...