从 Azure blob 存储下载所有文件,对其进行压缩并以 JAVA 格式上传 zip 文件

Posted

技术标签:

【中文标题】从 Azure blob 存储下载所有文件,对其进行压缩并以 JAVA 格式上传 zip 文件【英文标题】:Download all the files from Azure blob storage , zip it and upload the zip file in JAVA 【发布时间】:2021-09-28 18:18:30 【问题描述】:

我想从 Azure blob 存储下载所有文件,从这些文件中创建一个 zip 文件,然后将 zip 文件上传回 blob 存储。 由于文件大小可能非常大,我不想最大化内存。 此操作还需要非常快。

JAVA SDK - azure-storage-blob 12.8.0

编辑:到目前为止编写的代码。不知道如何进一步并行上传 pipedinputstream 数据。

 String zipFileName = formFileName(exportRequest, requestId);
        final PipedOutputStream pipedOutputStream = new PipedOutputStream();
        final PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream);

  AzureObjectStoreService objectStoreService =managedObjectStoreUtils.getObjectStoreService();

            if (filesToZip.size() > 0) 
                System.out.println("Files to zip "+ filesToZip.size());
                CompletableFuture<Boolean> zipCreationFuture = CompletableFuture.runAsync(() -> 
                    LoggerHelper.logInfo(logger, "Inside createZIP file async function");
                    ZipOutputStream zipOutputStream = new ZipOutputStream(pipedOutputStream);
                    try 
                        for (String fileName : filesToZip) 
                            try 
                                BlobClient blobClient = objectStoreService.getBlobContainerClient().getBlobClient(fileName);
                                LoggerHelper.logInfo(logger, "Adding zipEntry for file : " + fileName);
                                final ZipEntry zipEntry = new ZipEntry(fileName);
                                zipOutputStream.putNextEntry(zipEntry);
                                byte[] buffer;
                                ByteArrayOutputStream output = new ByteArrayOutputStream();
                                buffer= output.toByteArray();
                                blobClient.getBlockBlobClient().download(output);
                                int len;
                                while ((len = buffer.length) > 0) 
                                    zipOutputStream.write(buffer, 0, len);
                                
                                zipOutputStream.closeEntry();
                             catch (SdkClientException e) 
                                LoggerHelper.logExceptionWithMessage(logger, this.getClass().getName(), (Exception) e);
                                LoggerHelper.logError(logger, "Failed while getting s3 object");
                            
                        
                        zipOutputStream.finish();
                     catch (IOException ex) 
                        LoggerHelper.logExceptionWithMessage(logger, this.getClass().getName(), (Exception) ex);
                        LoggerHelper.logError(logger, "Creating zip file failed");
                     finally 
                        try 
                            zipOutputStream.close();
                             catch (IOException e) 
                            LoggerHelper.logExceptionWithMessage(logger, this.getClass().getName(), (Exception) e);
                            LoggerHelper.logError(logger, "Failed to close the zip output stream");
                        
                    
                    LoggerHelper.logInfo(logger, "Completed createZIP file async function");
        //            return true;
                ).handle((o, exception) -> 
                    LoggerHelper.logExceptionWithMessage(logger, this.getClass().getName(), (Exception) exception);
                    LoggerHelper.logError(logger, "Creating zip file failed");
                    return null;
                );

【问题讨论】:

欢迎来到 Stack Overflow。请编辑您的问题并包含您目前编写的代码以及您遇到的问题。 @GauravMantri 已编辑问题。我正在使用 pipedinputstream 并希望并行上传这些数据,但不确定哪些 azure blob 函数支持这一点。如果没有,请建议是否有其他方法可以实现这一目标。 @GauravMantri。有什么我可以检查/尝试的吗? 【参考方案1】:

能够做到这一点。如果有人有更好的方法,请告诉我。

CompletableFuture.runAsync(() -> 
                  
                    BlobClient blobClient = objectStoreService.getBlobContainerClient().getBlobClient(zipFileName);
                    BlobOutputStream blobOutputStream = blobClient.getBlockBlobClient().getBlobOutputStream();

                     try 
                            int nextData= pipedInputStream.read();
                            while (nextData!=-1) 
                                blobOutputStream.write(nextData);
                                nextData = pipedInputStream.read();
                            blobOutputStream.close();
                         catch (IOException e) 
                            e.printStackTrace();
                        

【讨论】:

以上是关于从 Azure blob 存储下载所有文件,对其进行压缩并以 JAVA 格式上传 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从 azure blob 存储下载文件

下载后如何从 azure blob 存储中删除文件

使用 Azure 函数从 Azure Blob 存储下载文件会返回不同的文件大小

从 Azure Blob 存储下载文件

使用 AspNet 从 Azure Blob 存储下载和重命名文件

恢复文件从用户的机器上传到 Azure Blob 存储和从 Azure Blob 下载文件到用户的机器在 Typescript(angular) 从浏览器