[英]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鏈接當時是否有以下片段。
如果您的數據不是
File
或String
您可以使用任何輸入流作為數據源,但您必須手動設置 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 建議的那樣,您可以使用S3Object
從MultipartFile.getInputStream()
、 MultipartFile.getContentType()
和MultipartFile.getSize()
獲得的Data Input Stream
、 Content Type
和Content Length
向S3Object
饋送。
如果您嘗試在 httpentity 中使用,請在此處查看我的答案
https://stackoverflow.com/a/68022695/7532946
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.