文件上传与下载压缩

文件上传:

这是一个通用的本地文件的上传代码,可以将文件类型存储到相应的本地目录下

注:本次演示为存储路径为项目所在的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文件上传与下载压缩的更多相关文章

  1. java文件上传和下载

    简介 文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...

  2. Java文件上传与下载

    文件上传与下载可谓上网中的常见现象.apache为我们准备了用于文件上传与下载的两个jar包(commons-fileupload-1.2.1.jar,commons-io-1.4.jar).我们在w ...

  3. Java 文件上传与下载、email

    1. 文件上传与下载 1.1 文件上传 文件上传,要点: 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: <input type="file" /> ...

  4. common-fileupload组件实现java文件上传和下载

    简介:文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...

  5. selenium java 文件上传、下载

    1.webdriver对页面文件的下载 我们一般操作浏览器下载时会让我们选择下载的目录然后经过一系列操作后才进行文件下载操作,但是用webdriver不能按这样的方式操作.经过查询资料找到了如下的实现 ...

  6. java文件上传、下载、图片预览

    多文件保存到本地: @ResponseBody    @RequestMapping(value = "/uploadApp",produces = { "applica ...

  7. 2013第38周日Java文件上传下载收集思考

    2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...

  8. SpringMVC文件上传和下载的实现

    SpringMVC通过MultipartResolver(多部件解析器)对象实现对文件上传的支持. MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipart ...

  9. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  10. java文件上传下载

    文件上传首先要引入两个核心包 commons-fileupload-1.2.1.jar commons-io-1.4.jar 下面是对文件上传和下载的一些代码做的一个简单封装,可以方便以后直接使用[使 ...

随机推荐

  1. 义无反顾马督工,Bert-vits2V210复刻马督工实践(Python3.10)

    Bert-vits2更新了版本V210,修正了日/英的bert对齐问题,效果进一步优化:对底模使用的数据进行优化和加量,减少finetune失败以及电音的可能性:日语bert更换了模型,完善了多语言推 ...

  2. scrum|敏捷开发之任务看板

    上篇文章中,我讲了敏捷第一步-每日站立会,讲了我们平时是怎么开站立会的,其实15-30分钟就够了,绝对不是时间长得让你想拄拐那种.本文我们开始讲敏捷开发中的看板.没有看板之前,我们真的是在白板上画泳道 ...

  3. C++ Qt开发:SpinBox数值微调框组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QSpinBo ...

  4. HDU-3591 混合背包

    The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  5. Educational Codeforces Round 160 (Rated for Div. 2) 题解A~D

    Educational Codeforces Round 160 (Rated for Div. 2) A. Rating Increase 纯暴力,分割字符串,如果n1<n2就输出,如果遍历完 ...

  6. 量化交易的相对强弱(RSI )指标计算及策略

    顾名思义,相对强弱指数 (RSI) 指标告诉我们资产的相对强弱.换句话说,RSI 告诉我们股票相对于自身的表现(或不表现).RSI 被视为一种强大的技术指标,可用于分析市场,并且是交易者武器库的重要组 ...

  7. gho、wim、esd的区别

    本文介绍的仅仅是压缩格式上的区别,并不是一些个体错误理解的 "GHOST 镜像 = 带驱动的快速装机镜像",实际 ESD 格式和 WIM 格式,也一样是可以集成驱动做成二次封装的快 ...

  8. 如何屏蔽各大AI公司爬虫User Agent

    罗列各大AI公司Scraper爬虫Crawler使用的User Agent,教您如何在robots.txt里面屏蔽这些爬虫的访问,禁止它们下载您的网站内容以训练 AI 模型,保护数据,降低带宽,防止宕 ...

  9. STM32CubeMX教程9 USART/UART 异步通信

    1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK ...

  10. 图片标注-----labelimage

    本人用的环境是   win10  +  python3.6 pip install labelimg 安装成功之后,找到  Anaconda 安装目录下的  Lib  , 然后找到   site-pa ...