2014-01-13 68 views
7

我有一个Java Spring MVC Web应用程序。从客户端到AngularJS,我正在上传文件并将其作为web服务发布到Controller。将MultipartFile转换为java.io.File而不复制到本地机器

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

但是我想上传文件到amazone S3 bucket。所以我必须将它转换为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. 

然后我使用FIleCopyUtils转换springframework的

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的

回答

6

默认情况下,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。

+0

唯一的问题是在本地机器上创建文件。我现在正在做的是,在亚马逊上传后,我从本地机器上删除。 –

+1

是什么激发了这个问题? S3 java-API?或者是什么 ?你有能力发送输入流到S3? – Boris

+0

这对于S3 API只接受文件参数是不正确的,它也接受InputStream –

5

这个问题已经超过一年了,所以我不确定当时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); 

事实证明,你不必先创建一个本地文件。由于@Boris建议您可以将S3ObjectData Input Stream,Content TypeContent Length一起分别从MultipartFile.getInputStream(),MultipartFile.getContentType()MultipartFile.getSize()得到。

相关问题