我目前的目标是创建一个用户上传的ZIP文件,将所有文件打包并将每个文件上传到Amazon S3。当文件位于ZIP文件的根目录下时,我当前的实现工作正常。如果ZIP中包含更多文件的文件夹在函数失败。这里是方法:Java解压缩所有文件,忽略目录并上传到S3
public Result zip() throws IOException {
Http.MultipartFormData body = request().body().asMultipartFormData();
List <Http.MultipartFormData.FilePart> uploadFilePart = body.getFiles();
for(Http.MultipartFormData.FilePart uploadFileParts: uploadFilePart) {
final File uploadfile = (File) uploadFileParts.getFile();
ZipFile zipIn = new ZipFile(uploadfile);
final Enumeration<? extends ZipEntry> entries = zipIn.entries();
while (entries.hasMoreElements()) {
final ZipEntry entry = entries.nextElement();
PutObjectRequest putObjectRequest = new PutObjectRequest(s3Bucket, entry.getName(), new File(entry.getName())); // create upload object to send to S3
putObjectRequest.withCannedAcl(CannedAccessControlList.Private); // set to private, so only the server can access it
s3Client.putObject(putObjectRequest); // upload file
}
zipIn.close();
}
return ok();
我正在使用Play框架。当我尝试上载文件夹内的一个ZIP,它抛出的错误:
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[SdkClientException: Unable to calculate MD5 hash: test/Selection_010.png (Not a directory)]]
什么我假设的情况是在entries.nextElement()被处理ZIP文件夹里面的“测试”作为文件它自我。我的目标不是在S3存储桶中包含任何文件夹,而只需包含ZIP中的文件,而不管它是否具有子文件夹。
有没有办法拉出ZIP子文件夹内的文件,以便像ZIP文件的根文件那样“行动”并将它们上传到S3?
干杯!
编辑:
我已经修改了方法的位:
while (entries.hasMoreElements()) {
final ZipEntry entry = entries.nextElement();
if (!entry.isDirectory()){
Logger.info(entry.getName());
PutObjectRequest putObjectRequest = new PutObjectRequest(s3Bucket, entry.getName(), new File(entry.getName())); // create upload object to send to S3
putObjectRequest.withCannedAcl(CannedAccessControlList.Private); // set to private, so only the server can access it
s3Client.putObject(putObjectRequest); // upload file
我想上传的zip文件的结构为:
- 工作区1_005 .png
- Selection_009.png
- 测试/ maxresdefault.jpg
- 测试/ 191559.jpg
在哪里 '测试' 是在Zip的子文件夹。如果我只是打印出来的拉链,我得到:
play.api.Play - Application started (Dev) application - Selection_009.png
application - Workspace 1_005.png
application - test/maxresdefault.jpg
application - test/191559.jpg
如果试图上传它抛出的错误:
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[SdkClientException: Unable to calculate MD5 hash: test/maxresdefault.jpg (Not a directory)]]
Caused by: com.amazonaws.SdkClientException: Unable to calculate MD5 hash: test/maxresdefault.jpg (Not a directory)
Caused by: java.io.FileNotFoundException: test/maxresdefault.jpg (Not a directory)
我想知道,如果它不拿起文件的正确路径或还有其他事情呢?任何帮助表示赞赏。谢谢!