我有一个Java Spring MVC Web应用程序。从客户端到AngularJS,我上传文件并将其作为webservice发布到Controller。
在我的控制器中,我将其视为 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 ?
答案 0 :(得分:8)
默认情况下,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。
答案 1 :(得分:5)
这个问题已经超过一年了,所以我不确定OP提供的jets35链接当时是否有以下代码段。
如果您的数据不是
File
或String
,您可以使用任何输入流作为数据源,但必须手动设置内容-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
,Data Input Stream
和Content Type
向Content Length
提供MultipartFile.getInputStream()
MultipartFile.getContentType()
,MultipartFile.getSize()
和{{3}}。
答案 2 :(得分:0)
如果您尝试在 httpentity 中使用,请在此处查看我的答案
https://stackoverflow.com/a/68022695/7532946