AWS 分段上传 SignatureDoesNotMatch
AWS Multipart Upload SignatureDoesNotMatch
我正在尝试使用分段上传将 PDF 文件上传到 AWS S3。但是,当我发送 PUT
上传部件的请求时,我收到 SignatureDoesNotMatch 错误。
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
我的服务器代码(节点)如下:
CREATE MultiPart Upload
const AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';
const s3 = new AWS.S3({ apiVersion: '2006-03-01' });
const s3Params = {
Bucket: 'bucket-name',
Key: 'upload-location/filename.pdf',
}
const createRequest = await s3.createMultipartUpload({
...s3Params
ContentType: 'application/pdf'
}).promise();
GET Signed URL
let getSignedUrlParams = {
Bucket: 'bucket-name',
Key: 'upload-location/filename.pdf',
PartNumber: 1,
UploadId: 'uploadId',
Expires: 10 * 60
}
const signedUrl = await s3.getSignedUrl('uploadPart',getSignedUrlParams);
客户端代码(在 JS 中)是:
const response = await axios.put(signedUrl, chunkedFile, {headers: {'Content-Type':'application-pdf'}});
一些注意事项:
- 当我允许所有 public 访问 bucket.However 时,此代码有效,如果阻止所有 public 访问,则代码无效。
- 在所有 public 访问被阻止的情况下,我仍然可以使用 aws cli 使用相同的凭据上传到存储桶。
- 我已经尝试重新生成 AWS 访问密钥 ID 和秘密访问密钥,但没有帮助。
无法弄清楚问题出在哪里。任何帮助,将不胜感激。
PS:这是我在这里发布的第一个问题。所以如果我没有适当地发布它,请原谅我。如果需要更多详细信息,请告诉我。
试试这样的方法,对我有用。
var fileName = 'your.pdf';
var filePath = './' + fileName;
var fileKey = fileName;
var buffer = fs.readFileSync('./' + filePath);
// S3 Upload options
var bucket = 'loctest';
// Upload
var startTime = new Date();
var partNum = 0;
var partSize = 1024 * 1024 * 5; // Minimum 5MB per chunk (except the last part) http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html
var numPartsLeft = Math.ceil(buffer.length / partSize);
var maxUploadTries = 3;
var multiPartParams = {
Bucket: bucket,
Key: fileKey,
ContentType: 'application/pdf'
};
var multipartMap = {
Parts: []
};
function completeMultipartUpload(s3, doneParams) {
s3.completeMultipartUpload(doneParams, function(err, data) {
if (err) {
console.log("An error occurred while completing the multipart upload");
console.log(err);
} else {
var delta = (new Date() - startTime) / 1000;
console.log('Completed upload in', delta, 'seconds');
console.log('Final upload data:', data);
}
});
}
上传失败会报错。如果您打印
的结果,我们可以帮助您解决这个问题
console.log(this.httpResponse)
和
console.log(this.request.httpRequest)
对我有用的是签名的版本。在初始化S3的时候,还应该提到签名版本。
const s3 = new AWS.S3({ apiVersion: '2006-03-01', signatureVersion: 'v4' });
从 axios
调用中删除 Content-Part
header。
const response = await axios.put(signedUrl, chunkedFile);
如果只添加一部分,您实际上并没有上传完整的文件,因此您的内容类型不是 application-pdf
。
这与为完整 object 执行 PUT
不同。
我正在尝试使用分段上传将 PDF 文件上传到 AWS S3。但是,当我发送 PUT
上传部件的请求时,我收到 SignatureDoesNotMatch 错误。
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
我的服务器代码(节点)如下:
CREATE MultiPart Upload
const AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';
const s3 = new AWS.S3({ apiVersion: '2006-03-01' });
const s3Params = {
Bucket: 'bucket-name',
Key: 'upload-location/filename.pdf',
}
const createRequest = await s3.createMultipartUpload({
...s3Params
ContentType: 'application/pdf'
}).promise();
GET Signed URL
let getSignedUrlParams = {
Bucket: 'bucket-name',
Key: 'upload-location/filename.pdf',
PartNumber: 1,
UploadId: 'uploadId',
Expires: 10 * 60
}
const signedUrl = await s3.getSignedUrl('uploadPart',getSignedUrlParams);
客户端代码(在 JS 中)是:
const response = await axios.put(signedUrl, chunkedFile, {headers: {'Content-Type':'application-pdf'}});
一些注意事项:
- 当我允许所有 public 访问 bucket.However 时,此代码有效,如果阻止所有 public 访问,则代码无效。
- 在所有 public 访问被阻止的情况下,我仍然可以使用 aws cli 使用相同的凭据上传到存储桶。
- 我已经尝试重新生成 AWS 访问密钥 ID 和秘密访问密钥,但没有帮助。
无法弄清楚问题出在哪里。任何帮助,将不胜感激。
PS:这是我在这里发布的第一个问题。所以如果我没有适当地发布它,请原谅我。如果需要更多详细信息,请告诉我。
试试这样的方法,对我有用。
var fileName = 'your.pdf';
var filePath = './' + fileName;
var fileKey = fileName;
var buffer = fs.readFileSync('./' + filePath);
// S3 Upload options
var bucket = 'loctest';
// Upload
var startTime = new Date();
var partNum = 0;
var partSize = 1024 * 1024 * 5; // Minimum 5MB per chunk (except the last part) http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html
var numPartsLeft = Math.ceil(buffer.length / partSize);
var maxUploadTries = 3;
var multiPartParams = {
Bucket: bucket,
Key: fileKey,
ContentType: 'application/pdf'
};
var multipartMap = {
Parts: []
};
function completeMultipartUpload(s3, doneParams) {
s3.completeMultipartUpload(doneParams, function(err, data) {
if (err) {
console.log("An error occurred while completing the multipart upload");
console.log(err);
} else {
var delta = (new Date() - startTime) / 1000;
console.log('Completed upload in', delta, 'seconds');
console.log('Final upload data:', data);
}
});
}
上传失败会报错。如果您打印
的结果,我们可以帮助您解决这个问题console.log(this.httpResponse)
和
console.log(this.request.httpRequest)
对我有用的是签名的版本。在初始化S3的时候,还应该提到签名版本。
const s3 = new AWS.S3({ apiVersion: '2006-03-01', signatureVersion: 'v4' });
从 axios
调用中删除 Content-Part
header。
const response = await axios.put(signedUrl, chunkedFile);
如果只添加一部分,您实际上并没有上传完整的文件,因此您的内容类型不是 application-pdf
。
这与为完整 object 执行 PUT
不同。