2013-06-16 4 views
3

Я пытаюсь выяснить, как сделать эквивалент fs.exists() на S3.node.js Amazon s3 как проверить файл существует

Мне удалось получить содержимое ведра, но я не могу понять, как спросить S3, если в ведре существует определенный файл (я не хочу загружать весь список файлов и проверять клиентскую сторону, потому что слишком много файлов).

Для справки: AWS2JS documentation on S3.GET

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', Содержание: [{Ключ: 'reports /', LastModified: '2013-06-16T17: 44: 25.000Z', ETag: '"d41d8cd98f00b204e9800998ecf8427e"', Размер: '0', Владелец: [Объект], : Класс складирования 'STANDARD'}, { Key: 'Отчеты/emot_cat_r1180341142.png', LastModified: '2013-06-16T23: 18: 59.000Z', ETag: '0b04aa9146d36a447019b1aa94be7eb3 "', Размер:«26374 ' Владелец: [Объект], Класс складирования: 'СТАНДАРТ'}, { Ключ: 'отчеты/polarity_r1180341142.png', LastModified: '2013-06-16T23: 19: 00.000Z', ETag:'» 22fd521e0a5e858040082d0d47078532" ' Размер: '23091', Владелец: [Object], Класс складирования: 'STANDARD'}, { Key: 'отчеты/wordcloud_r1180341142.png', LastModified:' 2013-06-16T23: 19: 07.000Z ', ETag: '9f7ee9d2fdce5f460b2c42444edd6efc "', Размер: '167164', Владелец: [Object], Класс складирования: 'STANDARD'}], '@': {XMLNS: {XMLNS: 'http://s3.amazonaws.com/doc/2006-03-01/'}}}

«{Содержимое: null, Key: [[путь/имя файла]»} - это моя попытка интерпретировать приведенные выше инструкции API.

Как вы можете видеть, он просто перечисляет содержимое ведра, но мне нужен вызов API для проверки наличия определенного файла.

Может ли кто-нибудь помочь? Я довольно новичок в этом.

ответ

8

Вы должны сделать это 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 } 
+0

Фантастический сервис сэр! Благодаря! – metalaureate

+0

Знаете ли вы, существует ли проблема с awsjs в Mocha? Когда я запускаю свой код снаружи, описываю (it()), он отлично работает. Но когда я завершаю код в тесте, ни один из обратных вызовов s3 не возвращается. Я добавлю этот отдельный вопрос. – metalaureate

+0

Я задал следующий вопрос: http://stackoverflow.com/questions/17151467/node-js-awsjs-s3-head-function-does-not-return-in-mocha-test-framework – metalaureate

4

Существующий ответ несколько лет. Есть лучший способ сделать это. Используя модуль aws-sdk, вы получаете хороший API, через который это можно сделать.

aws-sdk имеет функцию, называемую headObject, для просмотра метаданных файла. Вот пример использования. Я написал это в coffeescript, используя обещания.

Promise = require 'bluebird' 
AWS = require 'aws-sdk' 
AWS.config.accessKeyId = Config.Credentials.AWS.accessKeyId 
AWS.config.secretAccessKey = Config.Credentials.AWS.secretAccessKey 

S3 = new AWS.S3 
Promise.promisifyAll S3 

S3.headObjectAsync 
    Bucket: 'bucketname' 
    Key: 'file.txt' 
.then (result)-> 
    console.log 'success' 
    console.log result # this is an metadata object for the file, as seen below: 
    ### 
    { AcceptRanges: 'bytes', 
    LastModified: 'Mon, 16 Jan 2017 07:30:19 GMT', 
    ContentLength: '6', 
    ETag: '"b1946ac92492d2347c6235b4d2611184"', 
    ContentType: 'text/plain', 
    Metadata: {} } 
    ### 
.catch (error)-> 
    console.log 'failure' 
    console.log error.statusCode # 404 
Смежные вопросы