- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在我的 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
所以我开始搜索并找出 this post从 BalusC 中我得到它,我必须定义一个路径,其中来 self 的客户端的文件将被保存以便以后上传,例如在本例中上传到亚马逊 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 将部署在哪台机器上?谢谢
最佳答案
Just want somebody to clear things a little bit more for me, like what is the best path to put on here?
当您想要将文件上传到系统中时,请尽可能将其保留为字节流,因为您在条目中接收字节并且希望在末尾存储这些相同的字节。转换字节->文件->字节
非常耗时、消耗资源并且容易出错(编码转换和存储在文件系统上的文件可能确实是错误源)。
So I though this wasn't necessary and that was only duplicating the files:
FileOutputStream fileOutput = new FileOutputStream(uploadedFile);
fileOutput.write(file.getContents());
你是对的,因为该文件已经通过客户端 HTTP 请求上传。
做两次看起来很无奈。
但是你没有 File
而是一个 UploadedFile
(primefaces) 。
PutObjectRequest()
S3 API 的构造函数有多个重载。
实际上你使用它:
public PutObjectRequest(String bucketName,
String key,
File file)
最后一个参数是一个文件
。你看到不匹配的地方了吗?在第一个让您烦恼的代码中,您通过 writing the content of the UploadedFile
into a new File
解决了问题(当您有 UploadedFile
作为源时传递 File
)。如果您需要文件
,这是可以接受的。
但实际上您不需要文件,因为 PutObjectRequest()
构造函数有另一个 overload更适合您的用途:
public PutObjectRequest(String bucketName,
String key,
InputStream input,
ObjectMetadata metadata)
Constructs a new PutObjectRequest object to upload a stream of data to the specified bucket and key. After constructing the request, users may optionally specify object metadata or a canned ACL as well.
请注意,为了不影响性能,提供内容长度很重要:
Content length for the data stream must be specified in the object metadata parameter; Amazon S3 requires it be passed in before the data is uploaded. Failure to specify a content length will cause the entire contents of the input stream to be buffered locally in memory so that the content length can be calculated, which can result in negative performance problems.
所以你可以这样做:
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));
关于java - S3文件上传困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57130822/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
我搜索了很多,但没有一个链接能帮助我解决这个问题。我得到了 ORA-21500: internal error code, arguments: [%s], [%s], [%s], [%s], [%s
我正在做 RegexOne 正则表达式教程,它有一个 question关于编写正则表达式以删除不必要的空格。 教程中提供的解决方案是 We can just skip all the starting
([\s\S]+|\s?) 中 |\s? 的目的或作用是什么?如果没有它,表达式会不会与 ([\s\S]+) 相同? 最佳答案 这不是完全相同的。 ([\s\S]+|\s?) 会匹配空字符串,而 ([
这个正则表达式有一组还是两组? 我正在尝试使用第二组访问 bookTitle 但出现错误: Pattern pattern = Pattern.compile("^\\s*(.*?)\\s+-\\s+
在 C 中给定一个字符串指针 s,下面的迭代会做什么?即它以什么方式遍历字符串? for (++s ; *s; ++s); 最佳答案 for (++s ; *s;++s) 表示 将指针 s 递增到字符
我正在用一个 node.js 应用程序解析一个大列表并有这段代码 sizeCode = dbfr.CN_DESC.split('\s+-\s*|\s*-\s+') 这似乎不起作用,因为它返回了 [ '
我正在编写一个简单的字符串连接程序。 该程序按照我发布的方式运行。但是,我首先使用以下代码编写它来查找字符串的结尾: while (*s++) ; 但是,这个方法并没有奏效。我传递给它的字符串
这个问题已经有答案了: What does (?和aramchand来自Mohandas Karamchand G 因此,在使用这些匹配来分割字符串后,您最终会得到 {"M", "K", "G"} 注
我正在尝试转换 Map到 List使用 lambda。 本质上,我想将键和值与 '=' 连接起来之间。这看起来微不足道,但我找不到如何去做。 例如 Map map = new HashMap<>();
我正在经历 K & R,并且在递增指针时遇到困难。练习 5.3(第 107 页)要求您使用指针编写一个 strcat 函数。 在伪代码中,该函数执行以下操作: 将 2 个字符串作为输入。 找到字符串
在下面的代码中,pS 和 s.pS 在最后一行是否保证相等?也就是说,在语句S s = S();中,是否可以确定不会构造一个临时的S? #include using namespace std; s
演示示例代码: public void ReverseString(char[] s) { for(int i = 0, j = s.Length-1; i < j; i++, j--){
我一直在寻找类似于 .NET examples 中的示例的 PowerShell 脚本.取一个 New-TimeSpan 并显示为 1 天 2 小时 3 分钟 4 秒。排除其零的地方,在需要的地方添加
def func(s): s = s + " is corrected" return s string_list = ["She", "He"] for s in string_li
我是 python 的新手。当我在互联网上搜索 lambda 时。我在 lambda_functions 中找到了这个声明. processFunc = collapse and (lambda s:
我最近开始学习正则表达式,并试图为上面的问题写一个正则表达式。如果限制只放在一个字母上(例如不超过 2 个“b”),这并不困难。 那么答案就是:a* c*(b|ε)a* c*(b|ε)a* c* 但是
当我运行 npm install 时出现以下错误,但我无法修复它。 我试过:npm install -g windows-build-tools 也没有修复这个错误 ERR! configure
有很多有趣的haskell网上可以找到片段。 This post可以在 this (awesome) Stack Overflow question 下找到. The author写道: discou
我知道以下三行代码旨在将字符串提取到$ value中并将其存储在$ header中。但是我不知道$value =~ s/^\s+//;和$value =~ s/\s+$//;之间有什么区别。 $val
我是一名优秀的程序员,十分优秀!