AWS Java SDK使用元数据进行上载时出错
我正在尝试将一个文件上载到S3容器,在进行上载之前,我正在设置文件的元数据。上载失败,错误为签名不匹配。下面是我正在使用的代码:AWS Java SDK使用元数据进行上载时出错,java,amazon-web-services,amazon-s3,Java,Amazon Web Services,Amazon S3,我正在尝试将一个文件上载到S3容器,在进行上载之前,我正在设置文件的元数据。上载失败,错误为签名不匹配。下面是我正在使用的代码: public URL send(File f, HashMap<String,String> metadata, String type) throws Exception { String path = type+"/"+f.getName(); InitiateMultipartUploadRequest req = new Init
public URL send(File f, HashMap<String,String> metadata, String type) throws Exception {
String path = type+"/"+f.getName();
InitiateMultipartUploadRequest req = new InitiateMultipartUploadRequest(container, secretKey).withKey(path);
req.setCannedACL(CannedAccessControlList.AuthenticatedRead);
if (metadata != null) {
ObjectMetadata objectMetadata = new ObjectMetadata();
Set<String> keys = metadata.keySet();
Iterator<String> i = keys.iterator();
while (i.hasNext()) {
String key = i.next();
objectMetadata.addUserMetadata(key, metadata.get(key));
}
req.setObjectMetadata(objectMetadata);
}
InitiateMultipartUploadResult res = s3client.initiateMultipartUpload(req);
String uploadId = res.getUploadId();
long fileSize = f.length();
//check the size doesn't exceed max limit
if (fileSize > MAX_OBJ_SIZE) {
throw new Exception("Object size exceeds repository limit");
}
long chunkSize = 1024 * 1024 * 16;
int chunks = (int) (fileSize/chunkSize + 2);
List<PartETag> chunkList = new ArrayList<PartETag>();
long pos = 0;
try {
for (int i = 1; i < chunks; i++) {
if ((chunks -i) < 2) {
chunkSize = fileSize - pos;
}
UploadPartRequest upReq = new UploadPartRequest()
.withBucketName(container).withKey(path)
.withUploadId(uploadId).withPartNumber(i)
.withFileOffset(pos).withFile(f)
.withPartSize(chunkSize);
PartETag pTag = null;
// repeat the upload until it succeeds.
boolean repeat;
do {
repeat = false; // reset switch
try {
// Upload part and add response to our list.
pTag = s3client.uploadPart(upReq).getPartETag();
}
catch (Exception ex) {
repeat = true; // repeat
}
} while (repeat);
chunkList.add(pTag);
pos = pos + chunkSize;
}
CompleteMultipartUploadRequest compl = new CompleteMultipartUploadRequest(
container, secretKey, uploadId, chunkList).withKey(path);
CompleteMultipartUploadResult complRes = s3client.completeMultipartUpload(compl);
return new URL(URLDecoder.decode(complRes.getLocation(), "UTF-8"));
}
catch (Exception ex) {
s3client.abortMultipartUpload(new AbortMultipartUploadRequest(container,
secretKey, uploadId));
throw new Exception("File upload error: "+ex.toString());
}
}
S3Client.java中发生错误的第134行是:
InitiateMultipartUploadResult res = s3client.initiateMultipartUpload(req);
如果我没有附加任何元数据,上传工作正常。i、 e,如果我对以下行进行评论,则上传有效:
req.setObjectMetadata(objectMetadata);
我无法理解设置元数据时请求失败的原因。我在上传过程中是否遗漏了任何步骤?我能够通过URL编码元数据键和值来解决这个问题
objectMetadata.addUserMetadata(URLEncoder.encode(key, "UTF-8"), URLEncoder.encode(metadata.get(key),"UTF-8"));
显然,元数据似乎有一些令人不快的字符,这些字符会干扰AWS调用。这个解决方法可以让上传无误地完成,并更新元数据,但字符串仍然是url编码的,这在以后可能会出现问题 您的元数据密钥是什么样子的?我们正在使用ApacheTika库生成元数据。以下是无法上载元数据的PDF文件的列表-
创建日期,dcterms:modified,meta:save Date,Last modified,Date,created,xmpTPg,dcterms:created,Last save Date,modified,Content Type,meta:Creation Date,xmp:CreatorTool,生产者。
您知道是哪一个元数据条目导致了问题吗?URLEncoding也解决了我的问题。就我而言,这只是价值。metadata.addUserMetadata(“originalfilename”,URLEncoder.encode(“Manufactures_15.07.15(4)ủberarbeitet.csv”,“UTF-8”);现在起作用了。如果没有URL编码,它将无法工作。它似乎是特殊的字符,如空格、括号、umlauts等。
objectMetadata.addUserMetadata(URLEncoder.encode(key, "UTF-8"), URLEncoder.encode(metadata.get(key),"UTF-8"));