Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
node.js Amazon s3如何检查文件是否存在_Node.js_Amazon Web Services_Amazon S3 - Fatal编程技术网

node.js Amazon s3如何检查文件是否存在

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

我正试图找出如何在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调用来检查特定文件的存在


有人能帮忙吗?我对这一切都是新手。

您必须通过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)
  }
}