生成预签名 url 后出现 NoSuchKey 错误
I get NoSuchKey error after generating presigned url
我正在尝试为我的 s3 存储桶生成预签名 url。之后,当我在浏览器中复制粘贴生成的 url 时,出现此错误
<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<Key>xx</Key>
<RequestId>xx</RequestId>
<HostId>xx</HostId>
</Error>
我的代码:
const aws = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');
const dotenv = require('dotenv');
dotenv.config();
let region = 'us-east-1';
aws.config.update({
secretAccessKey: process.env.SECRET_ACCESS_KEY,
accessKeyId: process.env.ACCESS_KEY_ID,
region: region,
signatureVersion: 'v4'
});
var s3 = new aws.S3({
region:region
});
const fileFilter = (req, file, cb) => {
if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
cb(null, true);
} else {
cb(new Error('Invalid file type, only JPEG and PNG is allowed!'), false);
}
};
let bucketName = 'somebucketname123';
const signedUrlExpireSeconds = 60 * 5;
const url = s3.getSignedUrl('getObject', {
Bucket: bucketName,
Key: process.env.SECRET_ACCESS_KEY,
Expires: signedUrlExpireSeconds
})
console.log('url', url);
const upload = multer({
fileFilter: fileFilter,
storage: multerS3({
acl: 'public-read',
s3,
bucket: bucketName,
key: function(req, file, cb) {
req.file = file.originalname;
cb(null, file.originalname);
}
})
});
module.exports = upload;
我是 aws 的新手,我不知道我在这里做错了什么...
当我在浏览器中粘贴新生成的预签名 url 时会发生什么?
这是为某些特定文件生成的预置 url 吗?如果它在我的代码中的哪个位置,我应该告诉我的 s3 存储桶中的哪个文件名
bucketParms中的KEY应该是s3对象的key。
已签名 Url 用于从 S3 下载对象
存储桶:测试事件对象键:myfolder/test.json
const bucketParms = {
Bucket: "test-events",
Key: "myfolder/test.json",
Expires: 60,
};
下载:
s3.getSignedUrl("getObject", bucketParms, (error, url) => {
if (error) console.log("error", error);
if (url) console.log("url", url);
});
对于将对象上传到 S3,我们仍然需要指定要上传到的 Bucket 和 Key。
s3.getSignedUrl("putObject", bucketParms, (error, url) => {
if (error) console.log("error", error);
if (url) console.log("url", url);
});
使用这个URL上传,我们可以做一个curl或者postman
curl --location --request PUT 'https://test-events.s3.amazonaws.com/98..?X....' \
--header 'Content-Type: image/png' \
--data-binary '/Users/user/image/path'
或
来自 PostMan PUT/POST 和 Body binary
并选择文件。对象将上传到 myfolder/test.json
(所选文件的名称无关紧要)
我正在尝试为我的 s3 存储桶生成预签名 url。之后,当我在浏览器中复制粘贴生成的 url 时,出现此错误
<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<Key>xx</Key>
<RequestId>xx</RequestId>
<HostId>xx</HostId>
</Error>
我的代码:
const aws = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');
const dotenv = require('dotenv');
dotenv.config();
let region = 'us-east-1';
aws.config.update({
secretAccessKey: process.env.SECRET_ACCESS_KEY,
accessKeyId: process.env.ACCESS_KEY_ID,
region: region,
signatureVersion: 'v4'
});
var s3 = new aws.S3({
region:region
});
const fileFilter = (req, file, cb) => {
if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
cb(null, true);
} else {
cb(new Error('Invalid file type, only JPEG and PNG is allowed!'), false);
}
};
let bucketName = 'somebucketname123';
const signedUrlExpireSeconds = 60 * 5;
const url = s3.getSignedUrl('getObject', {
Bucket: bucketName,
Key: process.env.SECRET_ACCESS_KEY,
Expires: signedUrlExpireSeconds
})
console.log('url', url);
const upload = multer({
fileFilter: fileFilter,
storage: multerS3({
acl: 'public-read',
s3,
bucket: bucketName,
key: function(req, file, cb) {
req.file = file.originalname;
cb(null, file.originalname);
}
})
});
module.exports = upload;
我是 aws 的新手,我不知道我在这里做错了什么...
当我在浏览器中粘贴新生成的预签名 url 时会发生什么? 这是为某些特定文件生成的预置 url 吗?如果它在我的代码中的哪个位置,我应该告诉我的 s3 存储桶中的哪个文件名
bucketParms中的KEY应该是s3对象的key。
已签名 Url 用于从 S3 下载对象
存储桶:测试事件对象键:myfolder/test.json
const bucketParms = {
Bucket: "test-events",
Key: "myfolder/test.json",
Expires: 60,
};
下载:
s3.getSignedUrl("getObject", bucketParms, (error, url) => {
if (error) console.log("error", error);
if (url) console.log("url", url);
});
对于将对象上传到 S3,我们仍然需要指定要上传到的 Bucket 和 Key。
s3.getSignedUrl("putObject", bucketParms, (error, url) => {
if (error) console.log("error", error);
if (url) console.log("url", url);
});
使用这个URL上传,我们可以做一个curl或者postman
curl --location --request PUT 'https://test-events.s3.amazonaws.com/98..?X....' \
--header 'Content-Type: image/png' \
--data-binary '/Users/user/image/path'
或
来自 PostMan PUT/POST 和 Body binary
并选择文件。对象将上传到 myfolder/test.json
(所选文件的名称无关紧要)