使用Gulp将资产上传到s3

时间:2015-10-08 08:34:56

标签: javascript node.js amazon-s3 gulp aws-sdk

我目前正在尝试使用aws-sdk和gulp将网站的资源上传到amazon s3,但是现在我只是使用此代码上传了单个文件:

gulp.task('publish', function() {
    var AWS = require('aws-sdk'),
        fs = require('fs');

    AWS.config.accessKeyId = 'access_id';
    AWS.config.secretAccessKey = 'secret_key';
    AWS.config.region = 'eu-central-1';
    var fileStream = fs.createReadStream('folder/filename');
    fileStream.on('error', function (err) {
            if (err) { throw err; }
        });
    fileStream.on('open', function () {
    var s3 = new AWS.S3();
            s3.putObject({
                    Bucket: 'bucket_name',
                        Key: 'assets/filename',
                        Body: fileStream,
                        ACL:'public-read'
                        }, function (err) {
        if (err) { throw err; }
        else { console.log("Upload successfull"); }
                });
        });
});

由于我既不是node.js也不是JS dev,我不知道如何将所有资产上传到S3的文件夹资产中。

理想情况下,应用我用来上传一个文件的操作,但对于每个文件都会很整洁。这怎么可行?

1 个答案:

答案 0 :(得分:5)

找到解决我问题的方法。使用此代码,我最终设法使用正确的ACL将我的所有资产上传到我的存储桶。希望这可以帮助人们不要花太多时间在这样一个愚蠢的问题上。

/*
* Dependencies
*/

var gulp = require('gulp');
var AWS  = require('aws-sdk');
var fs   = require('fs');
var walk = require('walk');

/*
 * Declaration of global variables
 */


var isPaused = false;

/*
 * Bucket access informations
 */

AWS.config.accessKeyId = 'access_keyid'
AWS.config.secretAccessKey = 'secret_access_key'
AWS.config.region = 'region';

/*
 * Publishing function: uses a stream to push the files on the AWS Bucket
 */

function publishit(filename) {
var file = filename.substring('./'.length);
var key = file.substring('src/'.length);
var fileStream = fs.createReadStream(file);
isPaused = true;

// Check if there is an error on the file
fileStream.on('error', function (err) {
        if (err) { throw err; }
    });

// Action to do on opening of the file
fileStream.on('open', function () {
        var s3 = new AWS.S3();

        // Uploading the stream to the bucket
        s3.putObject({
                Bucket: 'bucket_name',
                    Key: key,
                    Body: fileStream,
                    ACL:'public-read'
                    }, function (err) {
                // Show the error if there is any
                if (err) { throw err; }

                // If everything went successfully, print which file is being uploaded
                else { console.log("Uploading asset "+ file); }

                // Closing the stream to avoid leaks and socket timeouts
                fileStream.close();

                // Changing the status of 'isPaused' to false to continue uploading the other assets
                isPaused = false;
            });
    });
}

gulp.task('assets', function() {

    var files   = [];

    // Walker options (first arg is the folder you want to upload)
    var walker  = walk.walk('./assets', { followLinks: false });

    walker.on('file', function(root, stat, next) {
            // Add this file to the list of files
            files.push(root + '/' + stat.name);
            next();
        });

    // Action after every file has been added to 'files'
    walker.on('end', function() {
            for (var filename in files){
                // Publish every file added to 'files'
                publishit(files[filename]);
                // Wait for one push on the server to be done before calling the next one
                function waitForIt(){
                    if (isPaused) {
                        setTimeout(function(){waitForIt()},100);
                    }
                };

            };
        });
});