2016-12-27 2 views
0

Ich habe mit http.get und s3.putObject gearbeitet. Im Grunde wollen Sie einfach nur eine Datei von einem http-Speicherort abrufen und speichern, wie es in S3 in einem Bucket ist. Scheint ziemlich einfach. Die ursprüngliche Dateigröße beträgt 47 KB.S3 PutObject in AWS Lambda (über Knoten) verdoppelt Dateigröße beim Speichern im Bucket

Das Problem ist, die abgerufene Datei (47kb) wird im S3-Bucket (mit s3.putObject) als 92.4kb Größe gespeichert. Irgendwo hat sich die Größe der Datei verdoppelt, so dass sie nicht mehr verwendbar ist.

Wie verhindere ich, dass sich die Größe der Datei bis zur Speicherung im S3-Bucket verdoppelt?

Hier ist der gesamte Code verwendet:

exports.handler = function(event, context) { 
    var imgSourceURL = "http://www.asite.com/an-image.jpg"; 
    var body; 
    var stagingparams; 
    http.get(imgSourceURL, function(res) { 
     res.on('data', function(chunk) { body += chunk; }); 
     res.on('end', function() { 
      var tmp_contentType = res.headers['content-type']; // Reported as image/jpeg 
      var tmp_contentLength = res.headers['content-length']; // The reported filesize is 50kb (the actual filesize on disk is 47kb) 
      stagingparams = { 
       Bucket: "myspecialbucket", 
       Key: "mytestimage.jpg", 
       Body: body 
      }; 
      // When putObject saves the file to S3, it doubles the size of the file to 92.4kb, thus making file non-readable. 
      s3.putObject(stagingparams, function(err, data) { 
       if (err) { 
        console.error(err, err.stack); 
       } 
       else { 
        console.log(data); 
       } 
      }); 
     }); 
    }); 
}; 

Antwort

1

Verwenden Sie ein Array die lesbaren Stream-Bytes zu speichern und dann verketten alle Puffer-Instanzen in dem Array zusammen, bevor s3.putObject Aufruf:

exports.handler = function(event, context) { 
    var imgSourceURL = "http://www.asite.com/an-image.jpg"; 
    var body = []; 
    var stagingparams; 
    http.get(imgSourceURL, function(res) { 
     res.on('data', function(chunk) { body.push(chunk); }); 
     res.on('end', function() { 
      var tmp_contentType = res.headers['content-type']; // Reported as image/jpeg 
      var tmp_contentLength = res.headers['content-length']; // The reported filesize is 50kb (the actual filesize on disk is 47kb) 
      stagingparams = { 
       Bucket: "myspecialbucket", 
       Key: "mytestimage.jpg", 
       Body: Buffer.concat(body) 
      }; 
      // When putObject saves the file to S3, it doubles the size of the file to 92.4kb, thus making file non-readable. 
      s3.putObject(stagingparams, function(err, data) { 
       if (err) { 
        console.error(err, err.stack); 
       } 
       else { 
        console.log(data); 
       } 
      }); 
     }); 
    }); 
}; 
+0

Sie, Herr, sind fantastisch! Das Array und die Verkettung waren die Lösung. – bepuzzled

Verwandte Themen