阿里雲打包成zip格式,批量下載


    /**
     * 從阿里雲下載文件 (以附件形式下載) 多個文件進行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();
        }
    } 

滿足了自己的開發需求,本人比較偷懶省事,直接把原作者的代碼copy過來記錄一下。

參考原文:https://blog.csdn.net/m0_37844800/article/details/81068833


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM