获取该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开发中的文件上传,单个文件下载,多个文件下载的需求的更多相关文章

  1. 详细阐述Web开发中的图片上传问题

    Web开发中,图片上传是一种极其常见的功能.但是呢,每次做上传,都花费了不少时间. 一个"小功能"花费我这么多时间,真心不愉快. So,要得认真分析下原因. 1.在最初学习Java ...

  2. Web开发安全之文件上传安全

    很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...

  3. 分享一个Snackbar工具类 SnackbarUtils;

    分享一个Snackbar工具类,源代码也是在Github上面找的,自己做了一下修改: 功能如下: 1:设置Snackbar显示时间长短                 1.1:Snackbar.LEN ...

  4. ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件

    前言: 从开始学习Vue到使用element-ui-admin已经有将近快两年的时间了,在之前的开发中使用element-ui上传组件el-upload都是直接使用文件选取后立即选择上传,今天刚好做了 ...

  5. [红日安全]Web安全Day5 - 任意文件上传实战攻防

    本文由红日安全成员: MisakiKata 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目 ...

  6. Web应用安全之文件上传漏洞详解

    什么是文件上传漏洞 文件上传漏洞是在用户上传了一个可执行的脚本文件,本通过此脚本文件获得了执行服务器端命令的功能,这种攻击方式是最为直接,最为有效的,有时候,几乎没有什么门槛,也就是任何人都可以进行这 ...

  7. 基于HT for Web矢量实现HTML5文件上传进度条

    在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...

  8. 百度Web Uploader组件实现文件上传(一)

    Web Uploader WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势 ...

  9. JAVA WEB怎么实现大文件上传

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 改进后的代码不需要form标签,直 ...

随机推荐

  1. 1-Numpy的通用函数(ufunc)

    一.numpy“通用函数”(ufunc)包括以下几种: 元素级函数(一元函数):对数组中的每个元素进行运算 数组级函数:统计函数,像聚合函数(例如:求和.求平均) 矩阵运算 随机生成函数 常用一元通用 ...

  2. 数据结构C语言实现----直接插入排序

    直接插入排序(简单插入排序) 给定一个数字串:2 6 7 8 9 3 2 3 4 按从小到大的顺序排列输出 首先把第一个数字放到一个小组里:(2)6 7 8 9 3 2 3 4 让后从第二个数字开始往 ...

  3. Skill 脚本演示 ycChangeViaNumber.il

    https://www.cnblogs.com/yeungchie/ ycChangeViaNumber.il 使用鼠标滚轮快速修改 Via 的数量. 回到目录

  4. luogu CF125E MST Company wqs二分 构造

    LINK:CF125E MST Company 难点在于构造 前面说到了求最小值 可以二分出斜率k然后进行\(Kruskal\) 然后可以得到最小值.\(mx\)为值域. 得到最小值之后还有一个构造问 ...

  5. 2019 HL SC day2

    今天讲的是网络流 大部分题目都写过了 这里 就总结一番. bzoj 1066 裸的最大流 不过需要拆点细节方面有一点坑 剩下的 没什么了. //#include<bits/stdc++.h> ...

  6. OpenVINO学习系列1

    OpenVINO介绍 OpenVINO是英特尔推出一套基于深度学习的计算机视觉加速优化框架,支持其它机器学习平台模型的压缩优化.加速计算等功能. 自发布以后就得到开发者的青睐,其强大的模型优化与压缩能 ...

  7. Python自动化运维 技术与最佳实践PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取提取码:7bl4 一.内容简介 <python自动化运维:技术与最佳实践>一书在中国运维领域将有"划时代"的重要意义:一方面,这是国内第一本从纵.深和实践角度探 ...

  8. LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci 题解

    题目传送门 如果之前推过斐波那契数列前缀和就更好做(所以题目中给出了). 斐波那契数列前缀和题目链接 先来推一下斐波那契数列前缀和: \[\sum\limits_{i=1}^nf(i) \] 其中 \ ...

  9. LeetCode(2)---路径总和

      给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = ...

  10. vue中一些常见的面试题

    前言 一位正在学习前端的菜鸟,虽菜,但还未放弃. 内容 1,说一下vue中的指令 答: ①,v-html:主要用来渲染html节点,其作用与原生的innerHtml基本一致 ②,v-text:主要用来 ...