Java解压缩所有文件,忽略目录并上传到S3

时间:2017-02-28 17:29:50

标签: java amazon-s3 playframework zip

我目前的目标是获取用户上传的ZIP文件,将其删除并获取所有文件并将每个文件上传到Amazon S3。当文件位于ZIP文件的根目录时,我当前的实现工作正常。如果ZIP有一个包含更多文件的文件夹,则函数内部失败。这是方法:

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 Framework。当我尝试上传包含文件夹的ZIP时,会抛出错误:

  

play.api.http.HttpErrorHandlerExceptions $$ anon $ 1:执行异常[[SdkClientException:无法计算MD5哈希:test / Selection_010.png(不是目录)]]

我假设正在发生的是entries.nextElement()正在处理文件夹&#39; test&#39;在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

在哪里&#39;测试&#39;是Zip中的子文件夹。如果我打印出拉链,我会得到:

  

play.api.Play - 应用程序启动(开发)   应用程序 - Selection_009.png
  应用程序 - 工作区1_005.png
  application - test / maxresdefault.jpg
  application - test / 191559.jpg

如果尝试上传则会抛出错误:

  

play.api.http.HttpErrorHandlerExceptions $$ anon $ 1:执行异常[[SdkClientException:无法计算MD5哈希:test / maxresdefault.jpg(非目录)]]
  引起:com.amazonaws.SdkClientException:无法计算MD5哈希:test / maxresdefault.jpg(不是目录)
  引起:java.io.FileNotFoundException:test / maxresdefault.jpg(不是目录)

我想知道它是否没有找到正确的文件路径或其他内容?任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分: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
    }
}

这会迭代忽略目录,但不确定它是否是最有效的方式。