通过播放框架应用程序将文件上传到S3而不"触摸"磁盘

le-*_*ude 6 java file-upload amazon-s3 playframework playframework-2.2

我必须实现一个服务器,让一些用户可能将大量文件(数千兆字节的文件)上传到S3(虽然他们不知道它是S3).我已经在Python中实现了类似的东西,并使用Play框架实现了基本实现.

现在我的上传功能如下所示:

public Result uploadFile() {
      List<Http.MultipartFormData.FilePart> files = request().body().asMultipartFormData().getFiles();
      if (CollectionUtils.isNotEmpty(files)) {
          Bucket bucket = MY_BUCKET;
          UUID timeuuid;
          Promise<UploadResult> promise;
          ObjectNode responseMessage = Json.newObject();  
          for (Http.MultipartFormData.FilePart file : files) {
              timeuuid = TimeUUID.now();
              promise = Promise.promise(new UploadFunction(timeuuid, bucket, file.getFile(), obtainS3Connection()));
              responseMessage.set(file.getFilename(), TextNode.valueOf(timeuuid.toString()));
          }
          return accepted(responseMessage);
      } else {
          return badRequest("files empty");
      }
}
Run Code Online (Sandbox Code Playgroud)

我并不担心上传代码本身,实际上我已经实现了很多次.我担心的是让它变成Play!不将文件保存到磁盘,并且只发送文件"通过"我的服务器而不写入磁盘(即使是临时文件).我有一些处理涉及到某些内容的"客户端"加密,我可以做一个流.

我想知道Play是否已经这样做了?或者我将如何实现这一目标?

我假设Play(以及我之前版本的此服务中的Django)的作用是:

Upload --> Play       MyProcessing -------> S3
               \     /
                \   /
                 Disk
Run Code Online (Sandbox Code Playgroud)

我想要它做什么:

Upload --> Play --> MyProcessing -------> S3
Run Code Online (Sandbox Code Playgroud)

我想这样做的原因是我希望有可能在具有非常小的磁盘的实例上部署我的服务,并且我还希望保证在上载后没有人能够找到未加密的文件(如果我选择加密它).

更新:我还没有放弃......

我找到了一些可能的解决方案,不幸的是使用Scala.它们都围绕着与此讨论相同的主题: 播放2.x:使用Iteratees上传活动文件

我想知道这是否可以使用Java(我是我公司中唯一知道Scala的人,所以我不能推出一些我能成为唯一能够对其进行维护的人...因为有时候我希望休息或继续其他项目).

Mat*_*uer 1

我从未在 Play 中这样做过,但我在 Java 中做过类似的事情。我们的成功之路是将文件直接发布到 S3。基本上,您所做的就是为用户生成一个上传表单,其中发布 URL 不是由您的服务提供,而是由 Amazon 提供,并且用户浏览器直接上传到 S3。

上传成功后,当对象成功上传时,S3 将返回一个空文档,状态代码为 200。在我们的例子中,我们通过 jQuery 执行 post 调用,并等待 jQuery 成功处理程序,然后才更新我们的系统数据库。或者,可以指定带有 URL 的重定向表单字段,用户在成功上传后将重定向到该 URL。

有关详细信息,请访问: http://doc.s3.amazonaws.com/proposals/post.html