【问题标题】:Java Unzip all files, ignoring directories and upload to S3Java解压缩所有文件,忽略目录并上传到S3
【发布时间】:2017-03-01 23:29:24
【问题描述】:

我当前的目标是获取用户上传的 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 框架。当我尝试上传包含文件夹的 ZIP 时,它会引发错误:

play.api.http.HttpErrorHandlerExceptions$$anon$1: 执行异常[[SdkClientException: Unable to calculate MD5 hash: test/Selection_010.png (Not a directory)]]

我假设正在发生的事情是 entries.nextElement() 将 ZIP 中的文件夹“test”视为它自己的文件。我的目标是不在 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
  • test/maxresdefault.jpg
  • test/191559.jpg

其中 'test' 是 Zip 中的子文件夹。如果我只是打印出我得到的 zip:

play.api.Play - 应用程序已启动(开发) 应用程序 - Selection_009.png
应用程序 - 工作区 1_005.png
应用程序 - test/maxresdefault.jpg
应用程序-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(不是目录)

我想知道它是否没有选择正确的文件路径或其他原因?任何帮助表示赞赏。谢谢!

【问题讨论】:

    标签: java amazon-s3 playframework zip


    【解决方案1】:

    这样的?

     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
        }
    }
    

    这将通过忽略目录进行迭代,但不确定它是否是最有效的方式。

    【讨论】:

      猜你喜欢
      • 2019-10-14
      • 2014-07-26
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多