我使用的是亚马逊的Java SDK将文件上传到亚马逊S3亚马逊的Java SDK - 上传到S3
同时使用神器AWS-Java的SDK版本62年1月10日 - 下面的代码工作完美 - 注意,所有的幕后的布线工程
public boolean uploadInputStream(String destinationBucketName, InputStream inputStream, Integer numberOfBytes, String destinationFileKey, Boolean isPublic){
try {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(numberOfBytes);
PutObjectRequest putObjectRequest = new PutObjectRequest(destinationBucketName, destinationFileKey, inputStream, metadata);
if (isPublic) {
putObjectRequest.withCannedAcl(CannedAccessControlList.PublicRead);
} else {
putObjectRequest.withCannedAcl(CannedAccessControlList.AuthenticatedRead);
}
final Upload myUpload = amazonTransferManager.upload(putObjectRequest);
myUpload.addProgressListener(new ProgressListener() {
// This method is called periodically as your transfer progresses
public void progressChanged(ProgressEvent progressEvent) {
LOG.info(myUpload.getProgress().getPercentTransferred() + "%");
LOG.info("progressEvent.getEventCode():" + progressEvent.getEventCode());
if (progressEvent.getEventCode() == ProgressEvent.COMPLETED_EVENT_CODE) {
LOG.info("Upload complete!!!");
}
}
});
long uploadStartTime = System.currentTimeMillis();
long startTimeInMillis = System.currentTimeMillis();
long logGap = 1000 * loggingIntervalInSeconds;
while (!myUpload.isDone()) {
if (System.currentTimeMillis() - startTimeInMillis >= logGap) {
logUploadStatistics(myUpload, Long.valueOf(numberOfBytes));
startTimeInMillis = System.currentTimeMillis();
}
}
long totalUploadDuration = System.currentTimeMillis() - uploadStartTime;
float totalUploadDurationSeconds = Float.valueOf(totalUploadDuration)/1000;
String uploadedPercentageStr = getFormattedUploadPercentage(myUpload);
boolean isUploadDone = myUpload.isDone();
if (isUploadDone) {
Object[] params = new Object[]{destinationFileKey, totalUploadDuration, totalUploadDurationSeconds};
LOG.info("Successfully uploaded file {} to Amazon. The upload took {} milliseconds ({} seconds)", params);
result = true;
}
LOG.debug("Post put the inputStream to th location {}", destinationFileKey);
} catch (AmazonServiceException e) {
LOG.error("AmazonServiceException:{}", e);
result = false;
} catch (AmazonClientException e) {
LOG.error("AmazonServiceException:{}", e);
result = false;
}
LOG.debug("Exiting uploadInputStream - result:{}", result);
return result;
}
因为我迁移到AWS-Java的SDK的31年1月11日版本 - 这个代码停止工作 所有类保持不变,并有在我的IDE任何警告
但是 - 我确实看到以下记录到我的控制台
[2016-09-06 22:21:58,920] [s3-transfer-manager-worker-1] [DEBUG] com.amazonaws.requestId - x-amzn-RequestId: not available
[2016-09-06 22:21:58,931] [s3-transfer-manager-worker-1] [DEBUG] com.amazonaws.request - Received error response: com.amazonaws.services.s3.model.AmazonS3Exception: Moved Permanently (Service: null; Status Code: 301; Error Code: 301 Moved Permanently; Request ID: D67813C8A11842AE), S3 Extended Request ID: 3CBHeq6fWSzwoLSt3J7D4AUlOaoi1JhfxAfcN1vF8I4tO1aiOAjqB63sac9Oyrq3VZ4x3koEC5I=
上传依旧,但继续从过程侦听 - 事件代码是8,将代表传输失败
没有人有任何的想法是什么,我需要做的就是代码的再次合作这个块?
谢谢 达米安
*“请注意所有的场景作品背后的接线” * ...我没有信心,你是,在这一点上。错误消息表明您需要将桶的某个区域传递给某个构造函数,或者您不是,或者您传递的是与该桶的位置约束(区域)不一致的区域...所以请求被发送到并且到达错误的S3区域端点,并且#boom“301永久移动”。 –
我正在使用美国标准的桶位置。你会推荐设置一个特定的存储桶吗?哈哈相信我对你的担忧,但是这已经在现在的生产环境中运行了近2年,并且对图书馆进行了各种升级 - 这是第一次打破它的更新 – Damien
哦,我不怀疑接线是否正确但事情并非如人们预料的那样“偶然”发生,直到有人在某个地方消除了你所依赖的假设。不幸的是,我很少使用SDK--我的专业知识主要来自于直接与API端点合作并理解他们期望和返回的内容,这就是我有理由相信这是终端选择相关的原因。如果您有支持合同,请求标识和扩展请求标识可能会支持跟踪请求并给予提示。 –