获取该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. Typora+PicGo-Core(command line)+SMMS、github、gitee实现Typora图片上传到图床

    Typora+PicGo-Core(command line)+SMMS.github.gitee实现Typora图片上传到图床 1 安装插件2 配置config.json    2.1 设置SMMS ...

  2. SpringMVC入门和常用注解

    SpringMVC的基本概念 关于 三层架构和 和 MVC 三层架构 我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就 是浏览器服务器.在 ...

  3. 吴太银:华为消费者云服务Cassandra使用场景与最佳实践

    大家好,我是华为消费者云的吴太银. 我今天分享的主要是华为消费者云服务使用Cassandra的应用场景和最佳实践.我这个可能跟其他嘉宾分享的不太一样,因为前几个嘉宾讲的实际上对Cassandra原生的 ...

  4. Spring Cloud Data Flow用Shell来操作,方便建立CICD

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! 之前我们用两篇文章讲解了Spring Cloud Data Flow,例子都是用UI操作的,但我们在Linux系统上经常是无 ...

  5. Android——对话框的全部内容。(课堂总结)

    前面的总结是写过对话框的,但是那只是冰山一角,简单的创建和使用罢了. 今天具体讲下AlertDialog. 首先对话框不需要在布局里写,在活动里new出来的. AlertDialog.Builder ...

  6. 家庭记账本APP开发准备(二)

    今天学习了选项卡,为记账本的分类做了准备.主登录界面进行了优化,但仍未实现各个组件之间的跳转. 选项卡 activity_main.xml <?xml version="1.0&quo ...

  7. CSS漂亮盒子(上)

    HTML文档中的所有元素都是由矩形盒子构成的--不管是包含页面结构的容器元素,还是段落中的每行文本,归根结底都是盒子. 1.背景颜色 设置页面背景颜色. body { background-color ...

  8. IdentityServer4 (4) 静默刷新(Implicit)

    写在前面 1.源码(.Net Core 2.2) git地址:https://github.com/yizhaoxian/CoreIdentityServer4Demo.git 2.相关章节 2.1. ...

  9. 总结笔记 | 深度学习之Pytorch入门教程

    笔记作者:王博Kings 目录 一.整体学习的建议 1.1 如何成为Pytorch大神? 1.2 如何读Github代码? 1.3 代码能力太弱怎么办? 二.Pytorch与TensorFlow概述 ...

  10. 【模式识别与机器学习】——PCA主成分分析

    基本思想 其基本思想就是设法提取数据的主成分(或者说是主要信息),然后摒弃冗余信息(或次要信息),从而达到压缩的目的.本文将从更深的层次上讨论PCA的原理,以及Kernel化的PCA. 引子 首先我们 ...