Java文件上传与下载压缩
文件上传与下载压缩
文件上传:
这是一个通用的本地文件的上传代码,可以将文件类型存储到相应的本地目录下
注:本次演示为存储路径为项目所在的resources目录下,可通过url去访问本地文件数据适用于图片文本等的图片上传组件
// 保存的路径,相对路径,此处为项目resources目录下位置
private String relativePath = "src/main/resources";
@PostMapping(value = "/upload")
@Transactional
@ResponseBody
public void upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {
if (ObjectUtil.isNull(file) || StrUtil.isBlank(filename)) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "文件或文件名为空");
}
//1.创建文件夹
// 获取resource目录下路径
File directory = new File(relativePath);
//自定义路径
String uploadPath = directory.getCanonicalPath()+ "/static/upload/";
File uploadFolder = new File(uploadPath);
if (!uploadFolder.exists()) {
uploadFolder.mkdirs();
}
//2.保存文件
String filename = file.getOriginalFilename();
//添加随机的UUID,文件重命名
String rename = filename.substring(0, filename.lastIndexOf(".")) + "_" + RandomUtil.randomString(16);
//文件后缀
String suffix = filename.substring(filename.lastIndexOf(".") + 1);
//完整文件名
String longName = rename +"."+ suffix;
file.transferTo(new File(uploadFolder, longName));
//浏览器访问该静态资源路径
String urlPath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/upload/" + longName;
//3.存储附件表
Attachments att = new Attachments();
att.setFileName(longName);
att.setPath("/upload/"+longName);
att.setUrlPath(urlPath);
attachementsMapper.insert(att);
}
文件下载并添加到zip中进行下载
@GetMapping(value = "/downloadZip")
@Transactional
public void downloadZip(HttpServletResponse response, HttpServletRequest request) throws IOException {
//1. 设置响应头
response.setCharacterEncoding("utf-8");
response.setContentType("application/oct-stream");
// 返回客户端浏览器的版本号、类型
String agent = request.getHeader("USER-AGENT");
// 设置压缩包的名字,date为时间戳
Instant now = Instant.now();
long timestamp = now.toEpochMilli();
String time = String.valueOf(timestamp);
String downloadName = time + ".zip";
try {
// 针对IE或者以IE为内核的浏览器:
if (agent.contains("MSIE") || agent.contains("Trident")) {
downloadName = URLEncoder.encode(downloadName, StandardCharsets.UTF_8);
} else {
// 非IE浏览器的处理:
downloadName = new String(downloadName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
}
} catch (Exception e) {
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "系统异常");
}
final String charset = ObjectUtil.defaultIfNull(response.getCharacterEncoding(), CharsetUtil.UTF_8);
response.setHeader("Content-Disposition", StrUtil.format("attachment;filename=\"{}\"",
URLUtil.encode(downloadName, CharsetUtil.charset(charset))));
//2.取得文件列表
List<Attachments> attachmentList=Lists.newArrayListWithCapacity(10);
//3.遍历压缩
// 设置压缩流:直接写入response,实现边压缩边下载(@Cleanup用法类似于try-catch异常并主动关闭流)
@Cleanup OutputStream outputStream = response.getOutputStream();
@Cleanup ZipOutputStream zipOs = new ZipOutputStream(outputStream);
// 设置压缩方法
zipOs.setMethod(ZipOutputStream.DEFLATED);
// 遍历文件信息(主要获取文件名/文件路径等)
for (Attachments a : attachmentList) {
String filename = a.getFileName();
String contextPath = "/upload/" + f.getFileName();
File file = new File(contextPath);
Assert.isTrue(file.exists(), "文件不存在");
zipOs.putNextEntry(new ZipEntry(filename));
@Cleanup FileInputStream fs = new FileInputStream(file);
IOUtils.copy(fs, zipOs);
}
}
Java文件上传与下载压缩的更多相关文章
- java文件上传和下载
简介 文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...
- Java文件上传与下载
文件上传与下载可谓上网中的常见现象.apache为我们准备了用于文件上传与下载的两个jar包(commons-fileupload-1.2.1.jar,commons-io-1.4.jar).我们在w ...
- Java 文件上传与下载、email
1. 文件上传与下载 1.1 文件上传 文件上传,要点: 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: <input type="file" /> ...
- common-fileupload组件实现java文件上传和下载
简介:文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...
- selenium java 文件上传、下载
1.webdriver对页面文件的下载 我们一般操作浏览器下载时会让我们选择下载的目录然后经过一系列操作后才进行文件下载操作,但是用webdriver不能按这样的方式操作.经过查询资料找到了如下的实现 ...
- java文件上传、下载、图片预览
多文件保存到本地: @ResponseBody @RequestMapping(value = "/uploadApp",produces = { "applica ...
- 2013第38周日Java文件上传下载收集思考
2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...
- SpringMVC文件上传和下载的实现
SpringMVC通过MultipartResolver(多部件解析器)对象实现对文件上传的支持. MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipart ...
- java web学习总结(二十四) -------------------Servlet文件上传和下载的实现
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- java文件上传下载
文件上传首先要引入两个核心包 commons-fileupload-1.2.1.jar commons-io-1.4.jar 下面是对文件上传和下载的一些代码做的一个简单封装,可以方便以后直接使用[使 ...
随机推荐
- 黑客玩具入门——5、继续Metasploit
1.利用FTP漏洞并植入后门 实验靶机:Metasploitable2. 实践: 使用nmap扫描目标靶机 nmap -sV xxx.xxx.xxx.xxx(目标ip) 生成linux系统后门 msf ...
- [python][图像切割]给定手写数字图片完成数字切割
import torch import torch.nn as nn from torchvision import transforms from PIL import Image, ImageOp ...
- C++学习笔记二:变量与数据类型(整型)
1.int(整型数据): 1.1 进制的表示:十进制,八进制,16进制,二进制 int number1 = 15; // Decimal int number2 = 017; // Octal int ...
- IDEA创建MyBatis项目--实现简单的查操作
IDEA创建MyBatis项目--实现简单的查操作 1.创建一个maven工程,不使用模板 2.通过maven加载Mybatis依赖包 在pom文件中导入maven坐标 <dependencie ...
- Sliver 二开准备
cs被杀麻了,最近打算看看一下sliver的源码进行一下二开,这篇是记录遇到的一些问题 编译sliver Windows下 官方说用MingW,但是我自己用他带的make不行, 下载make ...
- Go 语言为什么建议多使用切片,少使用数组?
大家好,我是 frank,「Golang 语言开发栈」公众号作者. 01 介绍 在 Go 语言中,数组固定长度,切片可变长度:数组和切片都是值传递,因为切片传递的是指针,所以切片也被称为"引 ...
- MyBatis入门操作
MyBatis入门操作,其实是我只想验证一下instanceof是否能在xml中使用 根据官网,下面我创建一个普通Maven项目,引入依赖: <dependency> <groupI ...
- [P2416 泡芙] 题解报告
题目链接:P2416 泡芙 简化题意 给定一个无向图 \(G\),每条边有边权 \(0 / 1\),现给定 \(m\) 组询问,每次询问形如 \(s, t\),问是否可以从 \(s\) 走到 \(t\ ...
- Kafka 的基本使用
Kafka 是一款分布式消息发布和订阅系统,最初的目的是作为一个日志提交系统来使用.现在,也可以作为一般的消息中间件来使用. 组件介绍 相关的组件介绍如下表所示: 组件 解释 Broker 实际 Ka ...
- 2021-01-04:mysql里的innodb引擎的数据结构,你有看过吗?
福哥答案2021-01-04: 面试官刚开始问我看过mysql源码没,然后问了这个问题.回答B+树,过不了面试官那关. 答案来自<MySQL技术内幕 InnoDB存储引擎 第2版>第四章, ...