1. pom引入

<!--oss-->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>2.8.3</version>
    </dependency>
commons-compress:(文件压缩)

<!--文件压缩-->
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.14</version>
</dependency> 
 
<!--操作文件所需-->
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
三,代码实现
1.下载到本地临时目录

package com.test.oss.osstest.Util;import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.GetObjectRequest;
import org.apache.commons.compress.archivers.ArchiveOutputStream;
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.io.FileUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** 将OSS文件下载到本地并打包成zip格式保存*/
@RestController
public class FileOSSZIPUtil {/*** 从OSS服务中下载所需文件到本地临时文件* @param endponit oss对外服务的域名* @param accessKeyId 用户身份认证标识* @param accessKeySecret 用于加密签名字符串,oss用来验证签名字符串的秘钥* @param bucketName 要访问的存储空间* @param objectNames 要下载的对象/文件* @return*/private static String downloadOSS(String endponit, String accessKeyId, String accessKeySecret, String bucketName, List<String> objectNames){String basePath="src/main/resources/files";OSSClient ossClient = null;try{//创建OSSClient实例,用于操作oss空间ossClient = new OSSClient(endponit, accessKeyId, accessKeySecret);for (String objectName:objectNames){//指定文件保存路径String filePath = basePath+"/"+objectName.substring(0,objectName.lastIndexOf("/"));//判断文件目录是否存在,不存在则创建File file = new File(filePath);if (!file.exists()){file.mkdirs();}//判断保存文件名是否加后缀if (objectName.contains(".")){//指定文件保存名称filePath = filePath+"/"+objectName.substring(objectName.lastIndexOf("/")+1);}//获取OSS文件并保存到本地指定路径中,此文件路径一定要存在,若保存目录不存在则报错,若保存文件名已存在则覆盖本地文件ossClient.getObject(new GetObjectRequest(bucketName,objectName),new File(filePath));}}catch (Exception e){System.out.println(e.getMessage());e.printStackTrace();throw new RuntimeException(e.getMessage());}finally {//关闭oss连接if (ossClient != null){ossClient.shutdown();}}return basePath;}/*** 从OSS服务中下载所需文件到本地临时文件,并将文件以ZIP格式进行压缩* @param endpoint oss对外服务的域名* @param accessKeyId 用户身份认证标识* @param accessKeySecret 用于加密签名字符串,oss用来验证签名字符串的秘钥* @param bucketName 要访问的存储空间* @param objectNames 要下载的对象/文件* @param zipName zip文件名* @throws Exception*/@RequestMapping("/oss_zip")public static void fileToZip(String endpoint,String accessKeyId,String accessKeySecret,String bucketName,List<String> objectNames,String zipName) throws Exception {File file = null;try{//调用方法货物OSS中的文件String fileName = downloadOSS(endpoint, accessKeyId, accessKeySecret, bucketName, objectNames);//获取待压缩文件源file = new File(fileName);//指定压缩文件存放路径String  zipFileName = "src/main/resources/zipFiles/"+zipName+".zip";File zipFile = new File(zipFileName);//构建输出流FileOutputStream fout = new FileOutputStream(zipFile);//构建压缩输出流ArchiveOutputStream aos = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, fout);//判断获取的压缩实例是否为zip格式if (aos instanceof ZipArchiveOutputStream){//进行压缩实例强转ZipArchiveOutputStream zipos = (ZipArchiveOutputStream) aos;//将指定文件封装成压缩项,添加到压缩流中//判断文件是否存在if (file.exists()){//判断文件类型,调用文件处理方法zipDir(zipos,file,"");}}//关闭流aos.flush();aos.close();}catch (Exception e){System.out.println(e.getMessage());e.printStackTrace();}finally {//删除文件源,只保留zip文件if (file.exists()){//判断文件类型if(file.isDirectory()){//对文件夹进行处理递归删除(有内容的文件夹不能直接被删除)deleteFile(file);file.delete();//删除空文件夹}else {file.delete();//文件直接删除}}}}/*** 对压缩文件夹进行循环处理* @param zipos 压缩流* @param file 要处理的文件* @param baseDir 要处理的文件的文件夹路径* @throws IOException*/private static void zipDir(ZipArchiveOutputStream zipos,File file,String baseDir) throws IOException {if (file.isDirectory()){File[] files = file.listFiles();for (File f:files){//对文件进行递归判断zipDir(zipos,f,baseDir+file.getName()+File.separator);}}else{//将文件封装成压缩项//根据文件创建zip内容实体ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(file,baseDir+file.getName());//将根据文件创建的实体保存到压缩流中zipos.putArchiveEntry(zipArchiveEntry);//将内容输出到压缩文件中zipos.write(FileUtils.readFileToByteArray(file));zipos.closeArchiveEntry();}}/*** 文件及文件夹的递归删除* @param file*/private static void deleteFile(File file){if (file.isDirectory()){File[] files = file.listFiles();for (File f: files){deleteFile(f);//将循环后的空文件夹删除if(f.exists()){f.delete();}}}else{file.delete();}}public static void main(String[] args) {ArrayList<String> fileNames = new ArrayList<>();//oss的存储空间内部是扁平的,没有文件系统目录概念,所有的对象都隶属于其对应的存储空间,在下载是必须明确的指出要下在的文件,指定其上层(文件系统概念)文件夹,无法下载其内部文件//fileNames.add("image1/"); //WARN com.aliyun.oss - Cannot read object content stream: src\main\resources\files\image1 (拒绝访问。)/*fileNames.add("image1/image2/2.jpg");fileNames.add("image1/image2/3.jpg");fileNames.add("image1/0.jpg");*/fileNames.add("wxmall/ssy/imgUrl/612353.jpg");fileNames.add("wxmall/ssy/imgUrl/612354.jpg");try {//此连接OSS资源为本人OSS服务资源,可供学习人员进行下载测试,请勿做它用fileToZip("http://oss-cn-hangzhou.aliyuncs.com","LTAINbgTZ6PA6bLd","xbTMcpICuaGihpWhkIjWp2c2hpJUdr","test-ssish",fileNames,"testImage");} catch (Exception e) {e.printStackTrace();}}}

2.不建临时目录,上传流

操作思路:

  1. 先将文件从阿里云上以流的方式一一下载下来,并保存到集合中;
  2. 循环集合,将所有文件流保存到创建好的压缩包对象中;
  3. 响应到浏览器,并保存压缩包;
@RequestMapping("/api/downlownd")
public String getOssFile(HttpServletRequest request, HttpServletResponse response){// endpoint以杭州为例,其它region请按实际情况填写,1改为自己的String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";// 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建String accessKeyId = "LTAINbgTZ6PA6bLd";String accessKeySecret = "xbTMcpICuaGihpWhkIjWp2c2hpJUdr";String bucketName = "test-ssish";//要下载的文件名(Object Name)字符串,中间用‘,’间隔。文件名从bucket目录开始.5改为自己的String key = "wxmall/ssy/imgUrl/612353.jpg,wxmall/ssy/imgUrl/612354.jpg";try {// 初始化OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);;//6改为自己的名称String fileName = "压缩包.zip";// 创建临时文件File zipFile = File.createTempFile("压缩包", ".zip");FileOutputStream f = new FileOutputStream(zipFile);/*** 作用是为任何OutputStream产生校验和* 第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种)*/CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());// 用于将数据压缩成Zip文件格式ZipOutputStream zos = new ZipOutputStream(csum);String[] keylist = key.split(",");for (String ossfile : keylist) {// 获取Object,返回结果为OSSObject对象OSSObject ossObject = ossClient.getObject(bucketName, ossfile);// 读去Object内容  返回InputStream inputStream = ossObject.getObjectContent();// 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法,确保压缩包里面文件不同名zos.putNextEntry(new ZipEntry(ossfile.split("/")[3]));int bytesRead = 0;// 向压缩文件中输出数据while((bytesRead=inputStream.read())!=-1){zos.write(bytesRead);}inputStream.close();zos.closeEntry(); // 当前文件写完,定位为写入下一条项目}zos.close();String header = request.getHeader("User-Agent").toUpperCase();if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {fileName = URLEncoder.encode(fileName, "utf-8");fileName = fileName.replace("+", "%20");    //IE下载文件名空格变+号问题} else {fileName = new String(fileName.getBytes(), "ISO8859-1");}response.reset();response.setContentType("text/plain");response.setContentType("application/octet-stream; charset=utf-8");response.setHeader("Location", fileName);response.setHeader("Cache-Control", "max-age=0");response.setHeader("Content-Disposition", "attachment; filename=" + fileName);FileInputStream fis = new FileInputStream(zipFile);BufferedInputStream buff = new BufferedInputStream(fis);BufferedOutputStream out=new BufferedOutputStream(response.getOutputStream());byte[] car=new byte[1024];int l=0;while (l < zipFile.length()) {int j = buff.read(car, 0, 1024);l += j;out.write(car, 0, j);}// 关闭流fis.close();buff.close();out.close();ossClient.shutdown();// 删除临时文件zipFile.delete();} catch (Exception e) {e.printStackTrace();}return null;
}

JAVA-阿里云OSS文件下载并将文件压缩为ZIP格式保存相关推荐

  1. 阿里云OSS后台实现远程文件上传下载

    1.登陆阿里云,开通OSS,找到官方文档 按照下列所有步骤点进去就可以找到官方文档 这里上传下载都在这里 现在实现方式,当然我是学的java 必传的四个参数 #文件上传配置 file:alicloud ...

  2. 阿里云OSS对象存储(文件上传与下载)宝宝级教程

    1.注册自己的阿里云账号 2.登录账号以后,进入主页面搜索"对象存储OSS 然后可以看到如下界面 立即购买,自己学习使用可以选择购买最小的存储空间,半年即可 管理控制台,购买了存储空间以后可 ...

  3. 阿里云OSS获取永久访问文件URL

    公司用的都是阿里云的OSS存储,正好阿里云可以免费试用一个月的100GB的OSS服务,发现全网都很少获取永久访问OSS文件的URL,都是有限时的,所有写下这篇文章记录 1. 如何获取永久访问OSS文件 ...

  4. JS - 阿里云 OSS 文件下载通用办法(支持跨域)

    // 创建 OSS 客户端对象 createOssClientTemp () {return new Promise((resolve) => {let client = new OSS({ac ...

  5. 阿里云OSS对象存储实现文件的上传,并返回访问路径

    话不多说,直接上干货 官方文档:https://help.aliyun.com/product/31815.html?spm=a2c4g.11186623.6.540.539d28bca7ZyUR 1 ...

  6. 阿里云OSS文件上传下载,拿来即用

    什么是OSS 我们可以理解为就是一个资源服务器,在这之前我也尝试过Nginx当静态资源服务器,但效果比较一般,为什么选择阿里云OSS,只是因为最近刚好公司用到了,所以就接入了,还有其他的比如七牛云,腾 ...

  7. java oss 批量传输_初步使用阿里云OSS对象存储功能

    在使用之前先了解上传文件/图片的过程,首先我觉得使用阿里云对象存储功能可以分为三种方式上传到阿里云OSS中: 1).第一种方案就是:浏览器把文件传到自己的程序中,通过Java代码去给阿里云OSS服务器 ...

  8. 文件分片上传阿里云OSS

    本文参考其他博客并结合自身编写 博客原作者:程序猿谢哥哥 博客原地址:https://blog.csdn.net/weixin_42825651/article/details/108792264 注 ...

  9. C#阿里云oss接口上传和下载文件

    一  前期准备工作:需要获取阿里云的:endpoint, accessKeyId, accessKeySecret这三个参数值,可以登录阿里云账号获取到. 再一个就是项目中需要引入阿里云的接口文件Al ...

最新文章

  1. 缩放浏览器不会换行_深入了解现代浏览器之三 - 渲染
  2. 关于HTML页以Get方法向asp.net页面传值乱码的解决
  3. python中的reduce() 函数
  4. php 7.1安装教程
  5. 在运行Loaded runtime CuDNN library: 7103 (compatibility version 7100) but source was compiled with 7003
  6. 【初涉C语言】程序员欢迎来到C语言的世界!
  7. MySQL结果集 数据查询(重点)
  8. Freeswitch拨号响应太慢的解决办法
  9. Atiitt uke兼wag集团2017年度成果报告总结 attilax著 1. 组织机构进一步完善 8大首席部门 1 2. 事业部进一步完善,以及一百多个事业部了 1 3. 企业文化进一步完善 1
  10. linux web部署命令简单记录
  11. 动易CMS - 模板的一些常用标签
  12. php 数独求解,高效算法求解数独(示例代码)
  13. 韩顺平-linux笔记
  14. 我对于产品经理的理解
  15. markdown公式指导手册
  16. 男人:从未了解的十五件事
  17. CSS实现背景图轮播
  18. ViT Patch Embedding理解
  19. zblog是PHP好还是,「zblog seo」PJBlog和Z-blog哪个好,他们各自的优点是什么,做SEO哪个好...
  20. 2021年9月计算机二级考试成绩查询常见问题

热门文章

  1. network is unreachable 网关PING不通解决办法
  2. jQuery触发 a 标签点击事件
  3. Java精品项目源码第98期疫情人员流动管理系统
  4. 从ORA-01752的错误,透过现象看本质
  5. 网络欺凌即将成为严重社会问题
  6. Win10系统强制禁用驱动程序签名
  7. Java源码阅读的真实体会(一种学习思路)
  8. Snapde一个全新的CSV超大文件编辑软件
  9. linux 内核 修改mss,Linux下TCP-MSS 修改,实验以及测试(详细)
  10. 讨厌的360日历怎么彻底删除?360日历功能彻底卸载方法