簡體   English   中英

node.js亞馬遜s3如何檢查文件是否存在

[英]node.js Amazon s3 how to check file exists

我試圖弄清楚如何在S3上執行相當於fs.exists()的操作。

我成功獲取了存儲桶的內容,但我無法弄清楚如何在存儲桶中存在特定文件時詢問S3(我不想下載整個文件列表並檢查客戶端,因為也有很多文件)。

供參考: S3.GET上的AWS2JS文檔

var s3 = require('aws2js').load('s3', appConfig.awsAccessKeyId, appConfig.awsSecretAccessKey);  
s3.setBucket(appConfig.awsBucketName);

            var folder = encodeURI('reports');
            var url = '?prefix=' + folder;

            s3.get(url,{Contents: null, Key: 'reports/emot_cat_r1180341142.png'},'xml', function (error, data) {
                console.log("Error",error);
                console.log("Data",data);
                true.should.be.true;
                done();
            });

輸出

{姓名:'umusergen',前綴:'報告',標記:{},MaxKeys:'1000',IsTruncated:'false',內容:[{Key:'reports /',LastModified:'2013-06-16T17: 44:25.000Z',ETag:'“d41d8cd98f00b204e9800998ecf8427e”',大小:'0',所有者:[Object],StorageClass:'STANDARD'},{Key:'reports / emot_cat_r1180341142.png',LastModified:'2013-06 -16T23:18:59.000Z',ETag:'“0b04aa9146d36a447019b1aa94be7eb3”',大小:'26374',所有者:[Object],StorageClass:'STANDARD'},{Key:'reports / polarity_r1180341142.png',LastModified:' 2013-06-16T23:19:00.000Z',ETag:'“22fd521e0a5e858040082d0d47078532”',大小:'23091',所有者:[Object],StorageClass:'STANDARD'},{Key:'reports / wordcloud_r1180341142.png', LastModified:'2013-06-16T23:19:07.000Z',ETag:'“9f7ee9d2fdce5f460b2c42444edd6efc”',大小:'167164',所有者:[Object],StorageClass:'STANDARD'}],'@':{xmlns: {xmlns:' http : //s3.amazonaws.com/doc/2006-03-01/ '}}}

“{Contents:null,Key:'[file path / name]'}”是我嘗試解釋上面引用的API指令。

如您所見,它只是枚舉存儲桶的內容,但我需要API調用來檢查特定文件是否存在。

有人可以幫忙嗎? 我對這一切都很陌生。

您必須使用HEAD請求以HTTP方式執行此操作。 不存在的文件會觸發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 }

現有答案已有幾年歷史。 有一個更好的方法來做到這一點。 通過使用aws-sdk模塊,您可以通過它獲得一個很好的API。

aws-sdk有一個名為headObject的函數來查看文件的元數據。 這是示例用法

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)
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM