我目前的目標是創建一個用戶上傳的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)
我想知道,如果它不拿起文件的正確路徑或還有其他事情呢?任何幫助表示讚賞。謝謝!