Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';尽管上传成功,但在aws s3中找不到图像_Javascript_Angularjs_Node.js_Amazon S3 - Fatal编程技术网

Javascript Can';尽管上传成功,但在aws s3中找不到图像

Javascript Can';尽管上传成功,但在aws s3中找不到图像,javascript,angularjs,node.js,amazon-s3,Javascript,Angularjs,Node.js,Amazon S3,我正在使用文件上传模块 <?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>*</AllowedOrigin> <AllowedMethod>GET</AllowedM

我正在使用文件上传模块
<?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>
和我的节点后端

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中。我尽我所能把我的文件归档;我不在桶里。请注意,我的错误是什么,阻止了文件的上传或显示?如果您通过表单提交文件,那么下面的代码可能会对您有所帮助

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);
            }
        });
    });
};
exports.uploadImageToS3Bucket=函数(res、文件、文件夹、回调){
var fs=require('node-fs');
var AWS=要求('AWS-sdk');
var filename=file.name;//文件的实际文件名
var path=file.path;//将被放入临时目录中
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=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz012456789”;
变量大小=字符长度;
对于(变量i=0;i<5;i++){
var randomnumber=Math.floor(Math.random()*大小);
str=字符[随机数]+str;
}
filename=filename.replace(/\s/g');
var fileNewName=str+时间戳+“-”+文件名;
fs.readFile(路径、函数(错误、文件缓冲区){
如果(错误){
imageUploadError(res,{});
}
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(参数、函数(错误、数据){
如果(错误){
控制台日志(err);
imageUploadError(res,{});
}否则{
返回回调(fileNewName);
}
});
});
};
但我建议您使用base64encoder,因为您可以直接从节点服务器将对象放入s3中,并将内容类型设置为文件类型/扩展名。
在大多数情况下,首选Base64方法,因为它不需要您通过http发送文件。

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

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);
            }
        });
    });
};
exports.uploadImageToS3Bucket=函数(res、文件、文件夹、回调){
var fs=require('node-fs');
var AWS=要求('AWS-sdk');
var filename=file.name;//文件的实际文件名
var path=file.path;//将被放入临时目录中
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=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz012456789”;
变量大小=字符长度;
对于(变量i=0;i<5;i++){
var randomnumber=Math.floor(Math.random()*大小);
str=字符[随机数]+str;
}
filename=filename.replace(/\s/g');
var fileNewName=str+时间戳+“-”+文件名;
fs.readFile(路径、函数(错误、文件缓冲区){
如果(错误){
imageUploadError(res,{});
}
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(参数、函数(错误、数据){
如果(错误){
控制台日志(err);
imageUploadError(res,{});
}否则{
返回回调(fileNewName);
}
});
});
};
但我建议您使用base64encoder,因为您可以直接从节点服务器将对象放入s3中,并将内容类型设置为文件类型/扩展名。 在大多数情况下,首选这种Base64方法,因为它不需要您通过http发送文件