gpt4 book ai didi

java - 上传到 AWS S3 时签名不匹配

转载 作者:行者123 更新时间:2023-11-30 02:36:26 28 4
gpt4 key购买 nike

由于我已经搜索了很长时间才找到该错误,因此我想在这里分享它,以防有人遇到同样的问题:我已经实现了以下代码片段来将数据上传到 S3:

public class S3FileUploadHandler {
private static final String USER_META_DATA_KEY_MODIFIED = "last-modified";
private static final SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
private final AmazonS3Client s3;
private final TransferManager tm;
private final String bucketName = "myTestBucket";
...

public void run() {
File file = ... // retrieve file to upload
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
final String key = ... // some path on S3
final ObjectMetadata objectMetadata = buildObjectMetadata(file);
final PutObjectRequest req = new PutObjectRequest(bucketName, key, fis, objectMetadata);
final Upload upload = tm.upload(req);
upload.addProgressListener(new MyProgressListener(upload));
upload.waitForCompletion();
} catch (final AmazonServiceExceptionase) {
logger.debug("Couldn't put file {}. AmazonServiceException {}", file, ase);
logger.error("Couldn't put file {}. AmazonServiceException Error Message: {}", file, ase.getMessage());
logger.error("HTTP Status Code: " + ase.getStatusCode());
logger.error("AWS Error Code: " + ase.getErrorCode());
logger.error("Error Type: " + ase.getErrorType());
logger.error("Request ID: " + ase.getRequestId());
} catch (final Exception e) {
...
} finally {
if (fis != null) {
fis.close();
}
}
}

private ObjectMetadata buildObjectMetadata(final File file) {
final ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(file.length());
final Date lastModifiedDate = new Date(file.lastModified());
final String dateStr = sdf.format(lastModifiedDate);
metadata.addUserMetadata(USER_META_DATA_KEY_MODIFIED, dateStr);
return metadata;
}
}

截取的代码将文件上传到 AWS S3 并保留文件的最后修改时间戳,我将此信息设置为用户元数据。

有时上面的代码可以工作,有时上传会因以下异常而中断:

Couldn't put file C:\Temp\xyz.txt. AmazonServiceException Error Message: The request signature we calculated does not match the signature you provided. Check your key and signing method. (Service: Amazon S3; Status Code: 403; Error Code: SignatureDoesNotMatch; Request ID: B8BC3251B9C1A3F5)
HTTP Status Code: 403
AWS Error Code: SignatureDoesNotMatch
Error Type: Client
Request ID: B8BC3251B9C1A3F5

最佳答案

上面代码中的错误是 SimpleDateFormat 可能包含非 ASCII 字符。

例如德国语言环境的最后修改日期可能是

Di Mär 21 10:29:00 MEZ 2017

AWS documentation指出

User-defined metadata is a set of key-value pairs. Amazon S3 stores user-defined metadata keys in lowercase. Each key-value pair must conform to US-ASCII when using REST and UTF-8 when using SOAP or browser-based uploads via POST.

AWS 确实可以在此处处理更好的异常文本,但根据上述信息,修复很简单:

private static final SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);

...导致(总是)接受元数据字符串

Tue Mar 21 10:29:00 CET 2017

关于java - 上传到 AWS S3 时签名不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42923075/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com