2017-02-28 65 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 
    } 
} 

這將迭代通過忽略目錄,不知道它是否是最有效的方式。

相關問題