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

本文介绍了一种从阿里云OSS批量下载指定用户文件夹内所有文件,并将其打包为ZIP文件的方法。通过使用OSSClient,遍历指定前缀下的所有文件,逐个读取并压缩至临时ZIP文件,最后提供下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先吐槽一下,这个问题我研究了好久,也上网看了很多文章,基本都是乱写一气,不懂装懂的不说,还TM(……&……%&……%#),算了,进入正题吧还是。

 

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流没有关闭,仔细检查一下)。

### 阿里云OSS批量下载文件的方法教程 阿里云对象存储服务(OSS)支持通过多种方式实现文件的批量下载,包括使用官方提供的SDK、命令行工具或直接通过浏览器访问公共链接等方式[^1]。以下是关于阿里云OSS批量下载文件的具体方法: #### 1. 使用OSS SDK实现批量下载 阿里云提供了多语言的OSS SDK,开发者可以通过编程的方式实现文件的批量下载。以下是一个基于Python的示例代码,展示如何通过OSS SDK批量下载文件: ```python import oss2 # 初始化OSS连接 auth = oss2.Auth('your-access-key-id', 'your-access-key-secret') bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'your-bucket-name') # 获取Bucket内所有文件列表 for obj in oss2.ObjectIterator(bucket): # 下载文件到本地 bucket.get_object_to_file(obj.key, f'./downloaded_files/{obj.key}') ``` 上述代码中,`your-access-key-id` 和 `your-access-key-secret` 是用户的访问密钥,`your-bucket-name` 是目标存储空间名称。通过遍历Bucket中的所有对象并调用`get_object_to_file`方法,可以将文件逐一下载到本地目录[^1]。 #### 2. 使用OSSUtil命令行工具 OSSUtil是一款由阿里云提供的高效命令行工具,支持对OSS进行各种操作,包括批量下载文件。以下是使用OSSUtil批量下载文件的命令示例: ```bash ossutil cp -r oss://your-bucket-name/local-folder ./local-path --include "*.*" ``` 在该命令中,`-r`参数表示递归操作,`--include "*.*"`用于指定需要下载的文件类型。通过这种方式,用户可以轻松地将整个文件夹或特定类型的文件从OSS下载到本地[^1]。 #### 3. 使用阿里云控制台手动下载 如果文件数量较少,也可以通过阿里云管理控制台手动实现批量下载。具体步骤如下: - 登录阿里云控制台,进入OSS管理页面。 - 选择目标Bucket和文件夹。 - 勾选需要下载的文件,点击“下载”按钮即可完成操作[^1]。 需要注意的是,手动下载方式适合少量文件的操作,对于大规模文件下载,建议优先考虑使用SDK或命令行工具。 --- #### 注意事项 - 在使用SDK或命令行工具时,请确保已正确配置访问权限和网络环境。 - 如果涉及大量文件的下载,建议合理设置并发数以提高效率,同时避免对OSS服务器造成过大的压力[^1]。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值