将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


问题答案:

默认情况下,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)将其另存为temp dir作为文件。

但是还有其他问题在这里-如果S3 API接受文件作为参数-您将无法执行任何操作-您需要一个真实的文件。如果您想完全避免创建文件,请创建自己的S3 API。