使用Gulp上传资产到s3

4

我目前正在尝试使用aws-sdk和gulp将网站资产上传到亚马逊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开发者,所以我不知道如何将S3的assets文件夹中的所有资源上传。

理想情况下,应用我用来上传一个文件的操作,但对于每个文件都要执行此操作会很不错。这该怎么做呢?

1个回答

6

我找到了解决我的问题的方法。使用这段代码,我终于成功地将所有资产上传到了我的存储桶,并且权限也正确设置了。希望这可以帮助其他人不要像我一样在这种愚蠢的问题上浪费太多时间。

/*
* 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);
                    }
                };

            };
        });
});

此解决方案将资产放入一个未命名的子文件夹中,该子文件夹位于资产文件夹内。 - hello world

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接