文件上传与下载压缩

文件上传:

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

注:本次演示为存储路径为项目所在的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. [ICPC2015WF] Tours

    题目描述 The Arca Carania Mountain national park is opening up for tourist traffic. The national park ha ...

  2. MybatisPlus查询时过滤不需要的字段~

    解释一下:乍一看标题可能有点懵~,其实就是想查询的时候过滤掉某些字段 例如: select name,email,password from user; --改为-> select name,e ...

  3. 封装Detours用于Python中x64函数hook

    Detours 代码仓库: https://github.com/microsoft/Detours x64写一个任意地址hook要比x86麻烦的多,所以这里直接封装框架来用于x64的hook. De ...

  4. 不用手动创建数据库,直接导入sql文件,就能生成数据库和数据表

  5. .NET周刊 【12月第3期 2023-12-24】

    国内文章 CAP 8.0 版本发布通告 - CAP 7岁生日快乐! https://www.cnblogs.com/savorboard/p/cap-8-0.html 今天宣布CAP 8.0版本正式发 ...

  6. Baidu Comate实践指南,惊艳了我...

    1 啥是Baidu Comate Comate是百度开发的编程大模型工具,它基于文心大模型,结合百度积累多年的编程现场大数据和外部优秀开源数据,为我们生成更符合实际研发场景的优质代码:它能提升编码效率 ...

  7. Linux发行版的基础目录名称、命名法则及功能规定

    罗列Linux发行版的基础目录名称命名法则及功用规定 目录描述 /主层次 的根,也是整个文件系统层次结构的根目录 /bin存放在单用户模式可用的必要命令二进制文件,所有用户都可用,如 cat.ls.c ...

  8. 在Mac上打开Emoji键盘 ⌨️

    因为想要输入Emoji字符,以前总上到网上搜,如 emojipedia.org ,然后复制.最近,输入Emoji有点多,就想查查有没有什么简便方法. 果然有,我用的是macOS,只要按下键盘上的 co ...

  9. 神经网络入门篇:详解深层网络中的前向传播(Forward propagation in a Deep Network)

    深层网络中的前向传播 先说对其中一个训练样本\(x\)如何应用前向传播,之后讨论向量化的版本. 第一层需要计算\({{z}^{[1]}}={{w}^{[1]}}x+{{b}^{[1]}}\),\({{ ...

  10. 华为云GaussDB为MetaERP“成本核算”产品“保驾护航”

    摘要:华为宣布实现了自主创新的MetaERP研发,并且完成了对旧ERP系统的全面替换,这其中,就采用了华为云GaussDB数据库特有的全密态技术,对ERP系统中的绝密数据进行加密保护,从而保障了数据的 ...