是否可以使用分段上传(Java高级API)将使用“ java.util.zip”提取的zip文件上传到AWS-S3。

问题描述 投票:0回答:1
需要通过使用流而不是使用lambda的/ tmp来使用多部分上传将大文件上传到AWS S3。文件已上传但未完全上传。

在我的情况下,无法预测zip中每个文件的大小,可能是一个文件的大小达到1 Gib。因此,我使用ZipInputStream从S3中读取内容,因此我想将其上传回S3。在lambda上,由于文件太大,我无法将文件保存在lambda的/ tmp中。但是我遇到了文件未完全写入的问题,我怀疑文件每次都被覆盖。请查看我的代码和帮助。

public void zipAndUpload { byte[] buffer = new byte[1024]; try{ File folder = new File(outputFolder); if(!folder.exists()){ folder.mkdir(); } AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); S3Object object = s3Client.getObject("mybucket.s3.com","MyFilePath/MyZip.zip"); TransferManager tm = TransferManagerBuilder.standard() .withS3Client(s3Client) .build(); ZipInputStream zis = new ZipInputStream(object.getObjectContent()); ZipEntry ze = zis.getNextEntry(); while(ze!=null){ String fileName = ze.getName(); System.out.println("ZE " + ze + " : " + fileName); File newFile = new File(outputFolder + File.separator + fileName); if (ze.isDirectory()) { System.out.println("DIRECTORY" + newFile.mkdirs()); } else { filePaths.add(newFile); int len; while ((len = zis.read(buffer)) > 0) { ObjectMetadata meta = new ObjectMetadata(); meta.setContentLength(len); InputStream targetStream = new ByteArrayInputStream(buffer); PutObjectRequest request = new PutObjectRequest("mybucket.s3.com", fileName, targetStream ,meta); request.setGeneralProgressListener(new ProgressListener() { public void progressChanged(ProgressEvent progressEvent) { System.out.println("Transferred bytes: " + progressEvent.getBytesTransferred()); } }); Upload upload = tm.upload(request); } } ze = zis.getNextEntry(); } zis.closeEntry(); zis.close(); System.out.println("Done"); }catch(IOException ex){ ex.printStackTrace(); } }

需要通过使用流而不是lambda的/ tmp使用multipart-upload将大文件上传到AWS S3。文件已上传但未完全上传。就我而言,每个压缩文件的大小...
java amazon-s3 zipinputstream
1个回答
0
投票
问题是您的内部while循环。基本上,您是从ZipInputStream读取1024个字节并将其上传到S3中。您将一次又一次地覆盖目标密钥,而不是流式传输到S3中。
© www.soinside.com 2019 - 2024. All rights reserved.