No se puede encontrar la imagen en aws s3 a pesar de la carga exitosa

Estoy utilizando el módulo de carga de archivos ng

   * GET DELETE POST PUT 3000 * Authorization   

He encontrado una pregunta similar aquí . Mi parte frontal angular es exactamente de los dos enlaces anteriores que es.

  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. }); }; }]); 

Y mi nodo de backend

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

Cuando subo, recibo una respuesta positiva de mi solicitud. Sin embargo, no puedo encontrar la imagen en mi cubo. Pensé en agregar mi fileNAme al s3Url. me gusta

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

Falla y devuelve error prohibido como resultado. Noté que con la variable de path anterior, el nombre del archivo no se debe agregar al s3Url. Intenté todo lo que pude pero mi archivo no se muestra en el cubo. Por favor, ¿qué estoy haciendo mal para evitar que el archivo se cargue o se muestre? Cualquier ayuda sería apreciada.

Si está enviando el archivo a través del formulario, el siguiente código podría ayudarlo.

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

Pero le sugiero que use el codificador base64 porque puede poner directamente un objeto en s3 desde su servidor de nodo y configurar el tipo de contenido como el tipo de archivo / extensión. Este enfoque de Base64 se prefiere en la mayoría de los casos, ya que no necesita enviar archivos a través de http.