【发布时间】: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