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

2.代码奉上。
-
/** -
* 从阿里云下载文件 (以附件形式下载) 多个文件进行zip下载 第二种 -
* @param request -
* @param response -
*/ -
@ResponseBody -
@RequestMapping(value = "/zipFilesDown", method = RequestMethod.GET) -
public void zipFilesDown(HttpServletRequest request, HttpServletResponse response){ -
String userId = request.getParameter("userId"); -
//阿里云基础配置 -
String endpoint = OSSConstants.OSS_ENDPOINT; -
String accessKeyId = OSSConstants.OSS_ACCESS_KEY_ID; -
String accessKeySecret = OSSConstants.OSS_ACCESS_KEY_SERCRET; -
String bucketName = OSSConstants.OSS_BUCKET_NAME_ONE; -
String fileHost = OSSConstants.OSS_FILE_HOST; -
try { -
// 初始化 -
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);; -
String fileName = userId + ".zip"; -
// 创建临时文件 -
File zipFile = File.createTempFile(userId, ".zip"); -
FileOutputStream f = new FileOutputStream(zipFile); -
CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32()); -
// 用于将数据压缩成Zip文件格式 -
ZipOutputStream zos = new ZipOutputStream(csum); -
// 构造ListObjectsRequest请求。 -
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); -
// 列出userId目录下的所有文件和文件夹。 -
listObjectsRequest.setPrefix(fileHost + "/" + userId + "/"); -
ObjectListing listing = ossClient.listObjects(listObjectsRequest); -
// 遍历所有文件。 -
System.out.println("Objects:"); -
for (OSSObjectSummary ossObjectSummary : listing.getObjectSummaries()) { -
System.out.println(ossObjectSummary.getKey()); -
String eachFileName = ossObjectSummary.getKey().substring(ossObjectSummary.getKey().lastIndexOf("-")+1); -
// 获取Object,返回结果为OSSObject对象 -
OSSObject ossObject = ossClient.getObject(bucketName, ossObjectSummary.getKey()); -
// 读去Object内容 返回 -
InputStream inputStream = ossObject.getObjectContent(); -
// 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法,确保压缩包里面文件不同名 -
zos.putNextEntry(new ZipEntry(eachFileName)); -
int bytesRead; -
// 向压缩文件中输出数据 -
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(); -
} -
}
此段代码大意是把阿里云上模拟的文件夹中的文件遍历出来,然后把这些文件按流的方式输出进临时创建的zip压缩文件中,最后把临时的压缩文件也用流输出,输出到页面上,供客户下载。临时生成的文件一定要删掉,要不然每次下载都会生成一个会影响系统运行(ps:如果删不掉就肯定是input流或者output流没有关闭,仔细检查一下)。
感谢 https://blog.youkuaiyun.com/m0_37844800/article/details/81068833
本文介绍了一种从阿里云批量下载文件的方法,并将其打包为ZIP文件供用户下载。该方法适用于需要频繁处理大量文件的场景。
760





