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

将MultipartFile转换为java.io.File而不复制到本地计算机,java,spring-mvc,file-io,multipart,Java,Spring Mvc,File Io,Multipart,我有一个JavaSpringMVCWeb应用程序。从客户端,通过AngularJS,我上传一个文件,并将其作为webservice发布到Controller 在我的控制器中,我将其设置为多部分文件,并可以将其复制到本地计算机 但是我想把文件上传到Amazone S3。因此,我必须将其转换为java.io.File。现在我正在做的是,我将它复制到本地机器上,然后使用上传到S3 这是我在控制器中转换的方法 MultipartHttpServletRequest mRequest=(Multipart

我有一个JavaSpringMVCWeb应用程序。从客户端,通过AngularJS,我上传一个文件,并将其作为webservice发布到Controller

在我的控制器中,我将其设置为多部分文件,并可以将其复制到本地计算机

但是我想把文件上传到Amazone S3。因此,我必须将其转换为java.io.File。现在我正在做的是,我将它复制到本地机器上,然后使用上传到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.
因此,它将在本地计算机中创建一个新文件。我正在S3中上传的那个文件

S3Object fileObject = new S3Object(newFile);

s3Service.putObject("myBucket", fileObject);
它在我的本地系统中创建文件。我不想创造


如果不在本地系统中创建文件,如何将多部分文件转换为java.io.file?

默认情况下,多部分文件在用户上载时已作为文件保存在服务器上。 从那时起,您可以对该文件执行任何操作。 有一种方法可以将临时文件移动到您想要的任何目标。

但是MultipartFile只是API,您可以实现任何其他MultipartResolver

这个API接受输入流,您可以用它做任何事情。默认实现(通常是commons multipart)将其作为文件保存到temp dir


但另一个问题仍然存在——如果S3API接受一个文件作为参数——您对此无能为力——您需要一个真正的文件。如果你想避免创建文件,那就创建你自己的S3API。

这个问题已经有一年多的历史了,所以我不确定OP提供的链接当时是否有以下代码片段

如果数据不是
文件
字符串
,则可以使用任何输入流作为数据源,但必须手动设置内容长度

//创建一个包含问候语字符串作为输入流数据的对象。
字符串问候语=“你好,世界!”;
S3Object helloWorldObject=新的S3Object(“HelloWorld2.txt”);
ByteArrayInputStream greetingIS=新的ByteArrayInputStream(greeting.getBytes());
setDataInputStream(greetingIS);
helloWorldObject.setContentLength(
greeting.getBytes(常量.DEFAULT\u编码).length);
setContentType(“文本/普通”);
s3Service.putObject(testBucket,helloWorldObject);

事实证明,您不必首先创建本地文件。正如@Boris建议的那样,您可以分别使用
数据输入流
内容类型
内容长度
S3Object
提供数据。

唯一的问题是在本地计算机中创建文件。我现在正在做的是,在亚马逊上传之后,我正在从我的本地机器上删除。是什么引发了这个问题?S3JavaAPI?还是怎样您有能力将输入流发送到S3吗?这对于S3API只接受文件参数是不正确的,它也接受InputStream
S3Object fileObject = new S3Object(newFile);

s3Service.putObject("myBucket", fileObject);