将 MultipartFile 转换为 java.io.File 而不复制到本地机器

新手上路,请多包涵

我有一个 Java Spring MVC Web 应用程序。从客户端,通过 AngularJS,我正在上传一个文件并将其作为 web 服务发布到 Controller。

在我的控制器中,我将它作为 MultipartFile 获取,我可以将它复制到本地机器。

但我想将文件上传到 Amazone S3 存储桶。所以我必须将它转换为 java.io.File 。现在我正在做的是,我将它复制到本地机器,然后使用 jets3t 上传到 S3。

这是我在控制器中转换的方式

MultipartHttpServletRequest mRequest=(MultipartHttpServletRequest)request;

Iterator<String> itr=mRequest.getFileNames();
        while(itr.hasNext()){
            MultipartFile mFile=mRequest.getFile(itr.next());
            String fileName=mFile.getOriginalFilename();

            fileLoc="/home/mydocs/my-uploads/"+date+"_"+fileName; //date is String form of current date.

然后我正在使用 SpringFramework 的 FIleCopyUtils

 File newFile = new File(fileLoc);

                  // if the directory does not exist, create it
                  if (!newFile.getParentFile().exists()) {
                    newFile.getParentFile().mkdirs();
                  }
                FileCopyUtils.copy(mFile.getBytes(), newFile);

所以它会在本地机器上创建一个新文件。我在 S3 中上传的那个文件

S3Object fileObject = new S3Object(newFile);

s3Service.putObject("myBucket", fileObject);

它在我的本地系统中创建文件。我不想创造。

在不在本地系统中创建文件的情况下,如何将 MultipartFIle 转换为 java.io.File

原文由 Shiju 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

默认情况下,当用户上传时,MultipartFile 已经作为文件保存在您的服务器上。从那时起 - 你可以用这个文件做任何你想做的事。有一种方法可以将该临时文件移动到您想要的任何目的地。 http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/web/multipart/MultipartFile.html#transferTo(java.io.File)

但 MultipartFile 只是 API,您可以实现任何其他 MultipartResolver http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/web/multipart/MultipartResolver.html

这个 API 接受输入流,你可以用它做任何你想做的事。默认实现(通常是 commons-multipart)将其作为文件保存到临时目录。

但其他问题仍然存在——如果 S3 API 接受一个文件作为参数——你不能用它做任何事情——你需要一个真实的文件。如果您想完全避免创建文件 - 创建您自己的 S3 API。

原文由 Boris 发布,翻译遵循 CC BY-SA 3.0 许可协议

这个问题已经存在一年多了,所以我不确定 OP 提供的 jets35 链接当时是否有以下片段。

如果您的数据不是 FileString 您可以使用任何 输入流 作为数据源,但 您必须手动设置 Content-Length

 // Create an object containing a greeting string as input stream data.
String greeting = "Hello World!";

S3Object helloWorldObject = new S3Object("HelloWorld2.txt");

ByteArrayInputStream greetingIS = new ByteArrayInputStream(greeting.getBytes());

helloWorldObject.setDataInputStream(greetingIS);
helloWorldObject.setContentLength(
    greeting.getBytes(Constants.DEFAULT_ENCODING).length);
helloWorldObject.setContentType("text/plain");

s3Service.putObject(testBucket, helloWorldObject);

事实证明,您不必先创建本地文件。 As @Boris suggests you can feed the S3Object with the Data Input Stream , Content Type and Content Length you’ll get from MultipartFile.getInputStream() , MultipartFile.getContentType()MultipartFile.getSize() 分别。

原文由 Kostas Filios 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题