2017-02-28 46 views
0

我目前的目标是创建一个用户上传的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)

我想知道,如果它不拿起文件的正确路径或还有其他事情呢?任何帮助表示赞赏。谢谢!

回答

0

像这样的东西?

File[] files = new File("").listFiles(); 
uploadFiles(files); 


public static void uploadFiles(File[] files) { 
    for (File file : files) { 
    if (file.isDirectory()) { 
     uploadFiles(file.listFiles()); // Calls same method again. 
    } else { 
     // do the uploading 
    } 
} 

这将迭代通过忽略目录,不知道它是否是最有效的方式。

相关问题