node.js Amazon s3如何检查文件是否存在
我正试图找出如何在S3上实现fs.exists()的等效功能 我成功地获取了bucket的内容,但是我不知道如何询问S3 bucket中是否存在特定的文件(我不想下载整个文件列表并检查客户端,因为文件太多了) 供参考: 输出 {Name:'umusergen',前缀:'reports',标记:{},MaxKeys: “1000”,IsTruncated:“false”,内容:[{Key:“reports/”, 最后修改:“2013-06-16T17:44:25.000Z”, ETag:“d41d8cd98f00b204e9800998ecf8427e”, 大小:“0”, 所有者:[对象], StorageClass:'标准'}, {Key:'reports/emot_cat_r1180341142.png', 最后修改:“2013-06-16T23:18:59.000Z”, ETag:“0b04aa9146d36a447019b1aa94be7eb3”, 尺寸:'26374', 所有者:[对象], StorageClass:'标准'}, {Key:'reports/polarity_r1180341142.png', 最后修改:“2013-06-16T23:19:00.000Z”, ETag:“22fd521e0a5e858040082d0d47078532”, 尺寸:'23091', 所有者:[对象], StorageClass:'标准'}, {Key:'reports/wordcloud_r1180341142.png', 最后修改:“2013-06-16T23:19:07.000Z”, ETag:“9f7ee9d2fdce5f460b2c42444edd6efc”, 尺寸:'167164', 所有者:[对象], StorageClass:'STANDARD'}],'@':{xmlns:{xmlns:{xmlns:''} {Contents:null,Key:'[file path/name]'}是我试图解释上面引用的API指令 如您所见,它只是枚举bucket的内容,但我需要API调用来检查特定文件的存在node.js Amazon s3如何检查文件是否存在,node.js,amazon-web-services,amazon-s3,Node.js,Amazon Web Services,Amazon S3,我正试图找出如何在S3上实现fs.exists()的等效功能 我成功地获取了bucket的内容,但是我不知道如何询问S3 bucket中是否存在特定的文件(我不想下载整个文件列表并检查客户端,因为文件太多了) 供参考: 输出 {Name:'umusergen',前缀:'reports',标记:{},MaxKeys: “1000”,IsTruncated:“false”,内容:[{Key:“reports/”, 最后修改:“2013-06-16T17:44:25.000Z”, ETag:“d41d
有人能帮忙吗?我对这一切都是新手。您必须通过HTTP方式通过HEAD请求来完成。不存在的文件会触发404错误。下面是一个简单的实现:
var s3 = require('aws2js').load('s3', process.env.AWS_ACCEESS_KEY_ID, process.env.AWS_SECRET_ACCESS_KEY)
s3.setBucket(process.env.AWS2JS_S3_BUCKET)
s3.head(process.argv[2], function (err, res) {
if (err) {
console.log(err)
return
}
console.log(res)
})
出于测试目的,请使用以下命令调用它:
node s3-check.js file/path.foo
示例:
node s3-check.js foo1.png
{ 'x-amz-id-2': 'BU8rLC35oZdNLh4TkE9Y5+czR5r9hg7kl/EbhkxUF+cA94F41knI2YNs/YG1acQg',
'x-amz-request-id': '7714B364EC1A27B2',
date: 'Mon, 17 Jun 2013 06:42:52 GMT',
'last-modified': 'Tue, 28 May 2013 13:18:12 GMT',
etag: '"2830931876c37237ae98458a99e86d85"',
'accept-ranges': 'bytes',
'content-type': 'image/png',
'content-length': '1165',
server: 'AmazonS3' }
node s3-check.js foo0.png
{ [Error: API error with HTTP Code: 404]
headers:
{ 'x-amz-request-id': '96841B9C0BC5E66D',
'x-amz-id-2': 'ZMZH9bkrR6nhDkWK1hM+qm0dlzBOYhOZhVyT3nKlMuZgPag//5EhfBuAHZq+9ZRm',
'content-type': 'application/xml',
'transfer-encoding': 'chunked',
date: 'Mon, 17 Jun 2013 06:43:53 GMT',
server: 'AmazonS3' },
code: 404 }
现有的答案是几年前的。有一个更好的方法可以做到这一点。通过使用该模块,我们为您提供了一个很好的API
aws sdk
具有一个调用的函数,用于查看文件的元数据。下面是使用示例
import Promise from 'bluebird'
import AWS from 'aws-sdk'
AWS.config.accessKeyId = Config.Credentials.AWS.accessKeyId
AWS.config.secretAccessKey = Config.Credentials.AWS.secretAccessKey
const s3 = new AWS.S3
Promise.promisifyAll(s3)
const getFileFromS3 = async ({ Bucket, Key })=> {
try {
const result = await S3.headObjectAsync({ Bucket, Key })
console.log(result)
/* Output:
{ AcceptRanges: 'bytes',
LastModified: 'Mon, 16 Jan 2017 07:30:19 GMT',
ContentLength: '6',
ETag: '"b1946ac92492d2347c6235b4d2611184"',
ContentType: 'text/plain',
Metadata: {} }
*/
} catch (error) {
if (error.statusCode === 404) console.log('File Not Found')
console.error('Unexpected Error', error)
}
}
您知道在摩卡运行AWSJ是否有问题吗?当我在descripe(it())之外运行代码时,它工作得很好。但是当我在测试中包装代码时,没有一个s3回调返回。我想补充一个单独的问题。我在这里问了一个后续问题:忽略这个-不相关的问题,道歉。我想说一些关于遗漏的事情,但人们已经插手了。一些提示:有时我忘记了应该将done()传递给it(),但是一个失败的带有超时的测试是一个很好的指示。否则,在我的例子中,如果调用已经存在,但没有传递给它(),jslint会大喊调用未定义的done()。我推荐一些静态代码分析工具。为琐碎的错误减轻了很多压力。谢谢-我以后会尝试。你能澄清一下
fs.exists()
的等价性在哪里吗?如果密钥不存在怎么办?它有接球的部分吗?是的,你是对的。写了这篇文章之后,我切换到了ES6,所以我重写了它,添加了一些可能更明确的行。
import Promise from 'bluebird'
import AWS from 'aws-sdk'
AWS.config.accessKeyId = Config.Credentials.AWS.accessKeyId
AWS.config.secretAccessKey = Config.Credentials.AWS.secretAccessKey
const s3 = new AWS.S3
Promise.promisifyAll(s3)
const getFileFromS3 = async ({ Bucket, Key })=> {
try {
const result = await S3.headObjectAsync({ Bucket, Key })
console.log(result)
/* Output:
{ AcceptRanges: 'bytes',
LastModified: 'Mon, 16 Jan 2017 07:30:19 GMT',
ContentLength: '6',
ETag: '"b1946ac92492d2347c6235b4d2611184"',
ContentType: 'text/plain',
Metadata: {} }
*/
} catch (error) {
if (error.statusCode === 404) console.log('File Not Found')
console.error('Unexpected Error', error)
}
}