我目前的目标是获取用户上传的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文件具有以下结构:
在哪里&#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(不是目录)
我想知道它是否没有找到正确的文件路径或其他内容?任何帮助表示赞赏。谢谢!
答案 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
}
}
这会迭代忽略目录,但不确定它是否是最有效的方式。