2016-04-30 31 views
1

自分のローカルファイルをS3バケットにアップロードするためのフォームを作成しようとしていますが、アップロードロジックの部分がどこに存在するかについて少し混乱しています。 POSTルートをきれいに保ち、別のファイルに格納されたAWSロジックを参照したいのですが、私は、ParamsレベルのBodyプロパティにどの値を使用するべきか、このモジュールをどのように参照するべきかについて少し混乱します完成したアップロードURLをデータベースプロパティのfileAttachment行に設定すると、誰かが私を正しい方向に向けることができますか?ここでNodejs Amazon S3ファイルアップロード

module.exports = function() { 

var path = require('path'); 
var async = require('async'); 
var fs = require('fs'); 
var AWS = require('aws-sdk'); 
var config = require(path.resolve(__dirname, '..', '..','./config/config.js')); 

AWS.config.region = config.region; 

var s3 = new AWS.S3({params: {Bucket: config.awsBucket}}); 

var params = {Key: config.awsAccessKeyId, Body: req.body.fileAttachment}; 

s3.upload(params, function(err, data){ 
    if (err) { 
     console.log("Error uploading data: ", err); 
    } else { 
     console.log("Successfully uploaded data to " + config.awsBucket + " /myKey"); 

    } 
}); 

return s3; 

}; 

は私のルートである:

appRoutes.route('/create/file') 

    .get(function(req, res){ 
     models.DiscoverySource.findAll({ 
      where: { 
       organizationId: req.user.organizationId 
      }, attributes: ['discoverySource'] 
     }).then(function(discoverySource){ 
      res.render('pages/app/file-create.hbs',{ 
       discoverySource: discoverySource 
      }); 
     }); 

    }) 



    .post(function(req, res){ 
     models.File.create({ 
      discovery: req.body.discovery, 
      discoverySource: req.body.discoverySource, 
      fileAttachment: 
      userId: req.user.user_id   
     }).then(function(){ 
      res.redirect('/app'); 
     }); 
    }); 

フォーム:

<form action="/app/create/file" method="post"> 
       <div class="form-header"> 
        <label for="data-discovery-source">Discovery Source:</label> 
        <select name="discoverySource"> 
         {{#each discoverySource}} 
         <option value="{{this.discoverySource}}">{{this.discoverySource}}</option> 
         {{/each}} 
        </select> 
        <label for="data-discovery">Discovery:</label> 
        <textarea id="discovery-text-field" name="discovery"></textarea> 
        <label for="report-link">File Attachment:</label> 
        <input type="file" name="fileAttachment"> 
       </div> 
       <button type="submit" id="create-button">Create File</button> 
      </form> 

答えて

2

あなたはmulter-S3を使用して試すことができます。ここ

は私のAWS-s3.jsファイルですモジュール。

AWSに設定されたstoraageでファイルをアップロードすることができます。

このコードでは、aws-sdkモジュールを使用しています。詳細については、hereを参照してください。

それは でのNode.jsはJavaScript用の推奨アマゾンAWS SDKを使用し、それはまた、ファイルをアップロードするためのmulter急行のミドルウェアを使用しています。

は、ここに私のコード例です。

var aws = require('aws-sdk') 
var express = require('express') 
var multer = require('multer') 
var multerS3 = require('multer-s3') 

var app = express() 
var s3 = new aws.S3({ {accessKeyId: 'akid', secretAccessKey: 'secret'}) 
//this can also be configured in config file and through code 



var upload = multer({ 
    storage: multerS3({ 
    s3: s3, 
    bucket: 'some-bucket', 
    key: function (req, file, cb) { 
     cb(null, Date.now().toString()) 
    } 
    }) 
}) 

//the upload.array -means that you can load multiple files(max 3) named photos maximum 3, the resulting AWS full path urls will be returned in req.files 
app.post('/upload', upload.array('photos', 3), function(req, res, next) { 
    //reference results that can be stored in database for example in req.files 
    res.send('Successfully uploaded ' + req.files.length + ' files!') 
}) 

このコードでも、multer npmモジュールが使用されます。設定の詳細については、single、any upload.array、フィールドはhereです。

+0

これを共有していただきありがとうございますが、多くの文書や質問と重複しているようには見えません。アクセスキーIDはどこで設定しますか? 'upload.array()'パラメータは何を表していますか?アップロードされたURLをデータベース 'fileAttachment'にどのように参照することができますか? – cphill

+0

私の答えを更新しました。 –

1

代わりにMinio-jsを使用することもできます。ここにはpresigned-postpolicy.jsの例があります。私はそれが助けて欲しい

var Minio = require('minio') 

var s3Client = new Minio({ 
    endPoint: 's3.amazonaws.com', 
    accessKey: 'YOUR-ACCESSKEYID', 
    secretKey: 'YOUR-SECRETACCESSKEY', 
    insecure: false // Default is false. 
}) 

// Construct a new postPolicy. 
var policy = s3Client.newPostPolicy() 
// Set the object name my-objectname. 
policy.setKey("my-objectname") 
// Set the bucket to my-bucketname. 
policy.setBucket("my-bucketname") 

var expires = new Date 
expires.setSeconds(24 * 60 * 60 * 10) //10 days 
policy.setExpires(expires) 

policy.setContentLengthRange(1024, 1024*1024) // Min upload length is 1KB Max upload size is 1MB 

s3Client.presignedPostPolicy(policy, function(e, formData) { 
    if (e) return console.log(e) 
    var curl = [] 
    curl.push('curl https://s3.amazonaws.com/my-bucketname') 
    for (var key in formData) { 
    if (formData.hasOwnProperty(key)) { 
     var value = formData[key] 
     curl.push(`-F ${key}=${value}`) 
    } 
    } 
    // Print curl command to upload files. 
    curl.push('-F [email protected]<FILE>') 
    console.log(curl.join(' ')) 
}) 

免責事項:私はMinioのために働く、AWS S3と互換性のあるオープンソースのオブジェクトストレージ。