我有不同的对象来生成保存在S3中的文件。每个对象调用以下函数来保存文件。
我只有以下几个问题。对象要么总是保存文件,要么永远无法保存文件。
/**
* Upload a file (with metadata).
*
* @param bucketId the id of the bucket
* @param key the key of the file
* @param inputStream the content of the file
* @param metadata the metadata of the file
* @return the eTag of the uploaded file
* @throws IOException If an error occurs during the file upload
*/
public String upload(String bucketId, String key, InputStream inputStream, Map<String, String> metadata) throws IOException {
LOG.info("Upload file {} on bucket {} with metadata: {}", key, bucketId, metadata);
CreateMultipartUploadRequest.Builder builder = CreateMultipartUploadRequest.builder();
if (!this.encryptionAlgorithm.equalsIgnoreCase("none")) {
builder = builder.serverSideEncryption(this.encryptionAlgorithm);
}
CreateMultipartUploadRequest createMultipartUploadRequest = builder.bucket(bucketId)
.key(key)
.metadata(metadata)
.build();
CreateMultipartUploadResponse createMultipartUploadResponse = s3Client.createMultipartUpload(createMultipartUploadRequest);
String uploadId = createMultipartUploadResponse.uploadId();
try {
List<CompletedPart> parts = uploadFileParts(bucketId, key, uploadId, inputStream);
CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest.builder()
.bucket(bucketId)
.key(key)
.uploadId(uploadId)
.multipartUpload(CompletedMultipartUpload.builder().parts(parts).build())
.build();
CompleteMultipartUploadResponse completeMultipartUploadResponse = s3Client.completeMultipartUpload(completeMultipartUploadRequest);
return completeMultipartUploadResponse.eTag();
} catch (Exception e) {
LOG.error("Error while uploading {} multipart {} on bucket {} with metadata {}", key, uploadId, bucketId, metadata, e);
s3Client.abortMultipartUpload(AbortMultipartUploadRequest.builder()
.bucket(bucketId)
.key(key)
.uploadId(uploadId)
.build());
throw e;
}
}
错误是
我们计算的请求签名与您提供的签名不匹配。检查您的AWS秘密访问密钥和签名方法。有关详细信息,请参阅REST身份验证和SOAP身份验证。(服务:S3,状态代码:403,请求ID:79b6c0a2-0d74-1f30-a4bf-246e9631ccd8,扩展请求ID:null)
我验证,bucket始终是相同的值,输入流数据包含文件的数据。数据成功传输到S3存储桶。键总是像eventsnapshot-21234-7-2021 08-12-1628767690000。jpg。
你已经有这样的问题了吗?
我发现了问题。如果元数据值的末尾有空格,AWS SDK生成的签名将与服务器返回的签名不同。
可能是S3修改了元数据的名称和值。
后来,我在aws sdk go中也发现了类似的问题:https://github.com/aws/aws-sdk-go/issues/2448
我使用的是aws sdk java的2.15.36版本。我不知道它是否在新版本的SDK中得到了修复。
我正试图上传一张使用AWS S3 SDK的图片。现在,这以前是有效的,但由于某种原因,它停止了工作,我开始得到这个错误: 现在,当我点击链接时,它会给我一个'NoSuchKey'错误: 我真的不明白这一点,因为我的键实际上只是一个字符串。我也试图上传一些东西,所以显然关键不会存在-我正在努力上传它! 另一个教程来自一个博客,我没有它的链接,但我上面的代码与文档中的这个教程相同。我所做的只是把它移到
我试图按照教程HTTP://docs.aws.amazon.com/amazons3/latest/api/sigv4-post-example.html使用HTTP post方法将图像上传到s3 bucket。但我每次都得到以下错误 政策如下: 生成策略和签名的代码将粘贴到相关的表单字段中:
我试图上传图片到s3与预先签署的url从aws SDK生成。 对于上面的返回url,当我试图访问它时,它给出了一个错误 null CORS配置 更新的解决方案
我试图生成签名的URL来上传和下载我的S3 bucket中的对象,但它失败了,“SignatureDoesNotMatch”如下所示。 我明白这是这里描述的问题的症状 而且,是的,我的桶存在。我怎么能用这个水落石出呢?
我想从网站content.geappliances.io使用AWS API网关得到响应,但总是得到错误: {“信息”:"我们计算的请求签名与您提供的签名不匹配。请检查您的AWS秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。\n\n此请求的规范字符串应为\n'GET\n/search/b2b/results\n\n内容类型:\n host:content.geapplications.io\
我试图从我的bucket中获取一个对象,但总是出现“签名不匹配”错误。我从AWS示例代码中获得了签名生成函数,因此我确信这是可行的。我还测试了上传功能,它可以正常工作。我只是在使用get object函数时遇到了问题。我花了大量的时间来验证这篇文章中的所有场景/答案,但什么都没用。所以我在这里寻求你的帮助。 我在标题中遗漏了什么吗?以下是创建的示例规范请求: 编辑1: 我尝试使用编译AWS示例代码