2014-12-02 6 views
0

Нашел на Heroku рецензию на загрузку частных s3 ведер, прямо из браузеров:браузера загрузить прямо на s3, скелетным Node.js

https://devcenter.heroku.com/articles/s3-upload-node

Для меня пакет AWS-SDK получил в пути больше, чем это помогло. Еще одна проблема - сомнительный сценарий s3upload.

Как загрузить прямо на s3 без всякой трещины в пути?

ответ

1

Пришлось выкопать старый Java-проект, чтобы понять это. Оказывается, это красиво и просто, как только вы приступите к делу. Во-первых, установка быстрая форма HTML, чтобы сделать загрузку:

<form action="https://BUCKETNAME.s3.amazonaws.com/" 
     method="post" 
     enctype="multipart/form-data"> 
    <input type="hidden" name="key" value="KEY"></input> 
    <input type="hidden" name="AWSAccessKeyId" value="ACCESS_KEY"></input> 
    <input type="hidden" name="policy" value="POLICY"></input> 
    <input type="hidden" name="signature" value="SIGNATURE"></input> 
    <input type='file' name='file'> 
    <input type='submit' value='Upload Driver Photo'> 
</form> 

Далее приготовить быстрый Node.js скрипт для генерации значений POLICY и SIGNATURE выше, в encodedPolicy и signature переменных ниже. Помните, что оба значения должны быть в формате base64:

var crypto=require("crypto"), 
    bucketName="BUCKETNAME", 
    secretKey="SECRET_KEY", 
    s3Key="KEY", 
    expiration= new Date(); 
expiration.setDate(expiration.getDate()+1); 
var policy={ 
    expiration:expiration.toISOString(), 
    conditions:[ 
    {bucket:bucketName}, 
    {key:s3Key} 
    ] 
}, 
    encodedPolicy=new Buffer(JSON.stringify(policy)).toString("base64"), 
    signature=crypto.createHmac(
    "sha1", secretKey 
).update(encodedPolicy).digest("base64"); 

Оберните Node.js выше код в Promise для дополнительных вкусового. Встраивайте в Angular/REST, Express с шаблонами или другими средствами промежуточного программного обеспечения/презентации.

Обратите внимание: код, указанный выше, не ограничивает размер загружаемого файла. Это было бы сделано с другим условием, то есть для ограничения 50 МБ: ["content-length-range", 0, 52428800].

1

вы можете сделать это с помощью minio-js, как показано на example

На сервере получить presigned URL для PUT, как это:

var presignedUrl = s3Client.presignedPutObject('my-bucketname', 'my-objectname', 1000, function(e, presignedUrl) { 
    if (e) return console.log(e) 
    console.log(presignedUrl) 
}) 

На браузере использовать этот presignedUrl сделать простой запрос PUT на S3 для загрузки объекта.