簡體   English   中英

將 MultipartFile 轉換為 java.io.File 而不復制到本地機器

[英]Converting MultipartFile to java.io.File without copying to local machine

我有一個 Java Spring MVC Web 應用程序。 從客戶端,通過 AngularJS,我上傳一個文件並將其作為網絡服務發布到控制器。

在我的控制器中,我將它作為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)將它作為文件保存到臨時目錄。

但其他問題仍然存在——如果 S3 API 接受一個文件作為參數——你不能用它做任何事情——你需要一個真實的文件。 如果您想完全避免創建文件 - 創建您自己的 S3 API。

這個問題已經一年多了,所以我不確定 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 建議的那樣,您可以使用S3ObjectMultipartFile.getInputStream()MultipartFile.getContentType()MultipartFile.getSize()獲得的Data Input StreamContent TypeContent LengthS3Object饋送。

如果您嘗試在 httpentity 中使用,請在此處查看我的答案

https://stackoverflow.com/a/68022695/7532946

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM