【问题标题】:Can't find image in aws s3 despite successful upload尽管上传成功,但在 aws s3 中找不到图像
【发布时间】:2016-05-04 20:24:49
【问题描述】:

我正在使用 ng-file-upload 模块

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
        <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

我发现了类似的问题Here。我的角度前端正是来自上面的两个链接。

 App.controller('MyCtrl2', ['$scope', '$http', 'Upload', '$timeout', function ($scope, $http, Upload, $timeout) {
    $scope.uploadPic = function(file) {
        var filename = file.name;
        var type = file.type;
        var query = {
            filename: filename,
            type: type
        };
        $http.post('/signing', query)
            .success(function(result) {
                Upload.upload({
                    url: result.url, //s3Url
                    transformRequest: function(data, headersGetter) {
                        var headers = headersGetter();
                        delete headers.Authorization;
                        return data;
                    },
                    fields: result.fields, //credentials
                    method: 'POST',
                    file: file
                }).progress(function(evt) {
                    console.log('progress: ' + parseInt(100.0 * evt.loaded / evt.total));
                }).success(function(data, status, headers, config) {
                    // file is uploaded successfully
                    console.log('file ' + config.file.name + 'is uploaded successfully. Response: ' + data);
                }).error(function() {

                });
            })
            .error(function(data, status, headers, config) {
                // called asynchronously if an error occurs
                // or server returns response with an error status.
        });
    };
}]);

还有我的节点后端

app.post('/signing', function(req, res) {
    var request = req.body;
    var fileName = request.filename
    var s3Url = 'https://' + aws.bucket + '.s3' +  '.amazonaws.com/';
    var extension = fileName.substring(fileName.lastIndexOf('.'));
    var today = new Date();
    var path = '/' + today.getFullYear() + '/' + today.getMonth() + '/' + today.getDate() + '/' + uuid.v4() + extension;

    var readType = 'private';

    var expiration = moment().add(5, 'm').toDate(); //15 minutes

    var s3Policy = {
        'expiration': expiration,
        'conditions': [{
                'bucket': aws.bucket
            },
            ['starts-with', '$key', path], 
            {
                'acl': readType
            },
            {
              'success_action_status': '201'
            },
            ['starts-with', '$Content-Type', request.type],
            ['content-length-range', 2048, 10485760], //min and max
        ]
    };

    var stringPolicy = JSON.stringify(s3Policy);
    var base64Policy = new Buffer(stringPolicy, 'utf-8').toString('base64');

    // sign policy
    var signature = crypto.createHmac('sha1', aws.secret)
        .update(new Buffer(base64Policy, 'utf-8')).digest('base64');

    var credentials = {
        url: s3Url,
        fields: {
            key: path,
            AWSAccessKeyId: aws.key,
            acl: readType,
            policy: base64Policy,
            signature: signature,
            'Content-Type': request.type,
            success_action_status: 201
        }
    };
    res.jsonp(credentials);
});

当我上传时,我的请求得到了肯定的回应。但是在我的存储桶中找不到图像。我想将我的文件名添加到 s3Url。喜欢

var s3Url = 'https://' + aws.bucket + '.s3' +  '.amazonaws.com/' + fileName;

它失败并因此返回禁止错误。我注意到上面的path 变量,文件名不应该附加到s3Url。我尽我所能,但我的文件没有显示在存储桶中。请问我做错了什么阻止文件上传或显示?任何帮助将不胜感激。

【问题讨论】:

    标签: javascript angularjs node.js amazon-s3


    【解决方案1】:

    如果您通过表单提交文件,那么以下代码可能会对您有所帮助。

    exports.uploadImageToS3Bucket = function(res, file, folder, callback) {
        var fs = require('node-fs');
        var AWS = require('aws-sdk');
    
    
        var filename = file.name; // actual filename of file
        var path = file.path; //will be put into a temp directory
        var mimeType = file.type;
    
        var accessKeyId = config.get('s3BucketCredentials.accessKeyId');
        var secretAccessKeyId = config.get('s3BucketCredentials.secretAccessKey');
        var bucketName = config.get('s3BucketCredentials.bucket');
    
        var timestamp = new Date().getTime().toString();
        var str = '';
        var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        var size = chars.length;
        for (var i = 0; i < 5; i++) {
            var randomnumber = Math.floor(Math.random() * size);
            str = chars[randomnumber] + str;
        }
        filename = filename.replace(/\s/g, '');
        var fileNewName = str + timestamp + "-" + filename;
    
        fs.readFile(path, function(error, file_buffer) {
            if (error) {
                responses.imageUploadError(res,{});
            }
            AWS.config.update({accessKeyId: accessKeyId, secretAccessKey: secretAccessKeyId});
            var s3bucket = new AWS.S3();
    
    
            var params = {Bucket: bucketName, Key: folder + '/' + fileNewName, Body: file_buffer, ACL: 'public-read', ContentType: mimeType};
            s3bucket.putObject(params, function(err, data) {
                if (err) {
                    console.log(err);
                    responses.imageUploadError(res,{});
                } else {
                    return callback(fileNewName);
                }
            });
        });
    };
    

    但我建议您使用 base64encoder,因为您可以直接从节点服务器将对象放入 s3 中,并将内容类型设置为文件类型/扩展名。 这种 Base64 方法在大多数情况下是首选的,因为它不需要您通过 http 发送文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      相关资源
      最近更新 更多