关于文件上传S3的困惑

BugsForBreakfast:

我正在将文件保存在S3存储桶上,但是我注意到这样做FileOutPutStream是这样的:

private UploadedFile file; // This is from PrimeFaces, the file that the client wishes to upload
File uploadedFile = new File(file.getFileName()); // Leaving the file like this creates the file on my IDE folder AFTER executing the next two lines, thats why I though the next lines were an error.

FileOutputStream fileOutput = new FileOutputStream(uploadedFile);
fileOutput.write(file.getContents());

所以这行代码负责在设备上写入文件,尽管这是一个错误或不必要,但我首先要这样做,因为我对将文件上传到亚马逊并不了解,所以我删除了这两行,因为我注意到我的上传方法只需要文件和文件名,如下所示:

businessDelegatorView.uploadPublicRead("mybucketname", fileName, fileToUpload);

所以我虽然这不是必需的,但这只是复制文件:

FileOutputStream fileOutput = new FileOutputStream(uploadedFile);
fileOutput.write(file.getContents());

但是我注意到,如果我删除它们,因为它引发了一个,FileNotFoundException所以上传不起作用,所以我开始搜索并从BalusC中找到这篇文章,然后我得到它,我必须定义一个路径,将从中保存我的客户文件后来在这种情况下像这样上传到amazon s3存储桶,但是我想知道例如在生成.WAR时这样做是否会起作用:

File uplodadFile = new File("C:/xampp/apache/conf", file.getFileName());

FileOutputStream fileOutput = new FileOutputStream(uploadFile);
fileOutput.write(file.getContents());

我将文件保存在那里作为测试,但是我不知道或不确定是否FileOutPutStream正确的选择,我不知道另一种方式。

这也是上面的代码执行后,上传方法的样子,如果没有,FileOutPutStream它将无法正常工作,原因是文件不在我的设备中

AmazonS3 amazonS3 = buildAmazonS3(); 
         try {
             amazonS3.putObject(new PutObjectRequest(bucketName, key, file).withCannedAcl(CannedAccessControlList.PublicRead));

只是希望有人为我多做一些事情,例如在这里穿上最好的方法是什么?

File uplodadFile = new File("C:/xampp/apache/conf", file.getFileName());

还是真的没关系,我只需要记住.WAR将部署在哪台计算机上?谢谢

大卫:

只是希望有人为我多做一些事情,例如在这里穿上最好的方法是什么?

如果要将文件上载到系统中,则应将其尽可能长地保存为字节流,因为您在输入中会收到字节,并且希望在末尾存储这些相同的字节。转换bytes->file->bytes非常耗时,耗资源并且容易出错(编码转换和存储在文件系统上的文件的确可能是错误的来源)。

所以我虽然这不是必需的,但这只是复制文件:

FileOutputStream fileOutput = new FileOutputStream(uploadedFile); fileOutput.write(file.getContents());

您说对了,因为该文件已由客户端HTTP请求上传。
这样做两次看起来很无助。
但是,那里没有File一个UploadedFile(primefaces)

PutObjectRequest()S3 API 构造函数有多个重载。
实际上,您使用它:

public PutObjectRequest(String bucketName,
                        String key,
                        File file)

最后一个参数是File您看到不匹配了吗?在惹恼你的第一个代码,你解决了这个问题(传递File,而你有一个UploadedFile由源)的内容写入UploadedFile到一个新的File,如果你需要一个可以接受File
但是实际上,您不需要File,因为PutObjectRequest()构造函数还有另一个重载可以更好地与您的使用相匹配:

public PutObjectRequest(String bucketName,
                        String key,
                        InputStream input,
                        ObjectMetadata metadata)

构造一个新的PutObjectRequest对象,以将数据流上传到指定的存储桶和键。构造请求后,用户可以选择指定对象元数据或罐头ACL。

请注意,为了不影响性能,提供内容长度很重要:

数据流的内容长度必须在对象元数据参数中指定;Amazon S3要求在上传数据之前先将其传递。不指定内容长度将导致输入流的全部内容在内存中本地缓冲,从而可以计算内容长度,这可能导致负面的性能问题。

所以你可以这样做:

UploadedFile file = ...; // uploaded by client
ObjectMetadata metaData = new ObjectMetadata();
metaData.setContentLength(file.getSize());
amazonS3.putObject(new PutObjectRequest(bucketName, key, file.getInputStream(), metaData)
        .withCannedAcl(CannedAccessControlList.PublicRead));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章