关于阿里云OSS的批量下载问题

1.首先自己登陆控制台查看自己的存储空间等信息

 

2.代码奉上。

 
  1. /**

  2. * 从阿里云下载文件 (以附件形式下载) 多个文件进行zip下载 第二种

  3. * @param request

  4. * @param response

  5. */

  6. @ResponseBody

  7. @RequestMapping(value = "/zipFilesDown", method = RequestMethod.GET)

  8. public void zipFilesDown(HttpServletRequest request, HttpServletResponse response){

  9. String userId = request.getParameter("userId");

  10. //阿里云基础配置

  11. String endpoint = OSSConstants.OSS_ENDPOINT;

  12. String accessKeyId = OSSConstants.OSS_ACCESS_KEY_ID;

  13. String accessKeySecret = OSSConstants.OSS_ACCESS_KEY_SERCRET;

  14. String bucketName = OSSConstants.OSS_BUCKET_NAME_ONE;

  15. String fileHost = OSSConstants.OSS_FILE_HOST;

  16. try {

  17. // 初始化

  18. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);;

  19. String fileName = userId + ".zip";

  20. // 创建临时文件

  21. File zipFile = File.createTempFile(userId, ".zip");

  22. FileOutputStream f = new FileOutputStream(zipFile);

  23.  
  24. CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());

  25. // 用于将数据压缩成Zip文件格式

  26. ZipOutputStream zos = new ZipOutputStream(csum);

  27.  
  28. // 构造ListObjectsRequest请求。

  29. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);

  30. // 列出userId目录下的所有文件和文件夹。

  31. listObjectsRequest.setPrefix(fileHost + "/" + userId + "/");

  32. ObjectListing listing = ossClient.listObjects(listObjectsRequest);

  33. // 遍历所有文件。

  34. System.out.println("Objects:");

  35. for (OSSObjectSummary ossObjectSummary : listing.getObjectSummaries()) {

  36. System.out.println(ossObjectSummary.getKey());

  37. String eachFileName = ossObjectSummary.getKey().substring(ossObjectSummary.getKey().lastIndexOf("-")+1);

  38. // 获取Object,返回结果为OSSObject对象

  39. OSSObject ossObject = ossClient.getObject(bucketName, ossObjectSummary.getKey());

  40. // 读去Object内容 返回

  41. InputStream inputStream = ossObject.getObjectContent();

  42. // 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法,确保压缩包里面文件不同名

  43. zos.putNextEntry(new ZipEntry(eachFileName));

  44. int bytesRead;

  45. // 向压缩文件中输出数据

  46. while((bytesRead=inputStream.read())!=-1){

  47. zos.write(bytesRead);

  48. }

  49. inputStream.close();

  50. zos.closeEntry(); // 当前文件写完,定位为写入下一条项目

  51. }

  52. zos.close();

  53. String header = request.getHeader("User-Agent").toUpperCase();

  54. if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {

  55. fileName = URLEncoder.encode(fileName, "utf-8");

  56. fileName = fileName.replace("+", "%20"); //IE下载文件名空格变+号问题

  57. } else {

  58. fileName = new String(fileName.getBytes(), "ISO8859-1");

  59. }

  60. response.reset();

  61. response.setContentType("text/plain");

  62. response.setContentType("application/octet-stream; charset=utf-8");

  63. response.setHeader("Location", fileName);

  64. response.setHeader("Cache-Control", "max-age=0");

  65. response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

  66.  
  67. FileInputStream fis = new FileInputStream(zipFile);

  68. BufferedInputStream buff = new BufferedInputStream(fis);

  69. BufferedOutputStream out=new BufferedOutputStream(response.getOutputStream());

  70. byte[] car=new byte[1024];

  71. int l=0;

  72. while (l < zipFile.length()) {

  73. int j = buff.read(car, 0, 1024);

  74. l += j;

  75. out.write(car, 0, j);

  76. }

  77. // 关闭流

  78. fis.close();

  79. buff.close();

  80. out.close();

  81.  
  82. ossClient.shutdown();

  83. // 删除临时文件

  84. zipFile.delete();

  85. } catch (Exception e) {

  86. e.printStackTrace();

  87. }

  88. }

此段代码大意是把阿里云上模拟的文件夹中的文件遍历出来,然后把这些文件按流的方式输出进临时创建的zip压缩文件中,最后把临时的压缩文件也用流输出,输出到页面上,供客户下载。临时生成的文件一定要删掉,要不然每次下载都会生成一个会影响系统运行(ps:如果删不掉就肯定是input流或者output流没有关闭,仔细检查一下)。

感谢 https://blog.csdn.net/m0_37844800/article/details/81068833

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值