2014-01-13 74 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()得到。

相關問題