2015-04-10 4 views
0

Итак, я новичок в Meteor, и я пытаюсь загрузить в ведро S3 с помощью edgee: slingshot. У меня есть файл настроек в корневом каталоге со следующей информацией.Загрузка файла Meteor S3 с помощью Slingshot

{ 

    "AWSAccessKeyId": "Key", 
    "AWSSecretAccessKey": "Key" 

} 

На стороне сервера у меня есть:

Slingshot.createDirective("Test", Slingshot.S3Storage, { 
    bucket: "test", 

    acl: "public-read", 

    key: function (file) { 

    return file.name; 
    } 
}); 

На стороне клиента у меня есть:

var doc = document.implementation.createHTMLDocument("New Document"); 
    var p = doc.createElement("p"); 
    p.innerHTML = "This is a new paragraph."; 

    try { 
    doc.body.appendChild(p); 
    console.log(doc); 
    } catch(e) { 
    console.log(e); 
    } 

    var uploader = new Slingshot.Upload("Test"); 

uploader.send(doc, function (error, downloadUrl) { 
    if (error) { 

    console.error('Error uploading', uploader.xhr.response); 
    alert (error); 
    } 
    else{ 
    console.log("Worked!"); 
    } 
}); 

Я использую Метеор на Windows, и ошибка:

S3:AWS key is undefined

Match error: Missing Key 'authorize'.

Я не совсем уверен, почему эта ошибка является ок. urring, поэтому помощь очень ценится.

Im работает с settings.json с meteor run --settings settings.json, и он отлично работает.

+0

У вас есть эти ключи на 'settings.json'? если да, вы должны запустить «meteor meteor» settings settings.json' – Ethaan

+0

Да! Я запускаю 'meteor run - settings settings.json'. – howtoexpert200

+0

кажется, что вам не хватает ведра. 'bucket String (обязательно) - Имя используемого ведра. По умолчанию Meteor.settings.S3Bucket.' – Ethaan

ответ

3

одна вещь, которая отсутствует является authorize функция в директиве, которая требуется (см API), так что добавьте

Slingshot.createDirective("Test", Slingshot.S3Storage, { 
    bucket: "test", 

    acl: "public-read", 

    authorize: function() { 
    // do some validation 
    // e.g. deny uploads if user is not logged in. 
    if (!this.userId) { 
     throw new Meteor.Error(403, "Login Required"); 
    } 

    return true; 
    }, 

    key: function (file) { 

    return file.name; 
    } 
}); 

Пожалуйста, обратите внимание, что также maxSize и allowedFileTypes требуется, так что вы должны добавить к клиенту и на стороне сервера (например, в lib/common.js)

Slingshot.fileRestrictions("Test", { 
    allowedFileTypes: ["image/png", "image/jpeg", "image/gif"], 
    maxSize: 10 * 1024 * 1024 // 10 MB (use null for unlimited) 
}); 

надеюсь, что это поможет.

0

Инициализировать директиву, как это на стороне сервера

Slingshot.createDirective('Test', Slingshot.S3Storage, { 
    bucket: 'test', 
    maxSize: 1024 * 1024 * 1, 
    acl: 'public-read', 
    region: AWS_REGION_OF_UR_BUCKET, 
    AWSAccessKeyId: YOUR_AWS_ACCESS_KEY_ID, 
    AWSSecretAccessKey: YOUR_AWS_SECRET_ACCESS_KEY, 
    allowedFileTypes: ['image/png', 'image/jpeg', 'image/gif'], 
    authorize: function() { 
    var message; 
    if (!this.userId) { 
    message = 'Please login before posting files'; 
    throw new Meteor.Error('Login Required', message); 
    } 
    return true; 
    }, 
    key: function(file) { 
    // admin would be the folder and file would be saved with a timestamp 
    return 'admin/' + Date.now() + file.name; 
    } 
}); 

Все остальное вроде бы в порядке.

Смежные вопросы