Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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
在node.js服务器上保存缩略图时,使用AWS sdk将base64编码的缓冲区放入AWS S3 bucket_Node.js_Amazon Web Services_Amazon S3_Graphicsmagick - Fatal编程技术网

在node.js服务器上保存缩略图时,使用AWS sdk将base64编码的缓冲区放入AWS S3 bucket

在node.js服务器上保存缩略图时,使用AWS sdk将base64编码的缓冲区放入AWS S3 bucket,node.js,amazon-web-services,amazon-s3,graphicsmagick,Node.js,Amazon Web Services,Amazon S3,Graphicsmagick,我正在尝试将图像发送到Heroku上托管的node.js服务器,并将图像的缩略图保存在mongoDB上托管的mongoDB中。我已经成功地直接上传到S3,但是自从我添加了graphicsMagick/imageMagick回调来创建缩略图以来,每次尝试都会收到错误。我有一个python脚本,它拍摄照片并将PUT请求连同相关请求细节一起发送到我的服务器,包括包含图像的base64编码字符串 我的当前代码收到的错误是来自Heroku的超时错误。我相当确定这是由于AWS由于缓冲区格式不正确而没有响应

我正在尝试将图像发送到Heroku上托管的node.js服务器,并将图像的缩略图保存在mongoDB上托管的mongoDB中。我已经成功地直接上传到S3,但是自从我添加了graphicsMagick/imageMagick回调来创建缩略图以来,每次尝试都会收到错误。我有一个python脚本,它拍摄照片并将PUT请求连同相关请求细节一起发送到我的服务器,包括包含图像的
base64
编码字符串

我的当前代码收到的错误是来自Heroku的超时错误。我相当确定这是由于AWS由于缓冲区格式不正确而没有响应

我也遇到过类似的问题

从这里开始,我不知道如何移动缓冲区。非常感谢您的帮助

my app.js中的相关代码如下所示:

更新 2014年3月3日 通过在aws sdk github站点上找到的一个示例,我能够实现这一点。相关更新的app.js代码如下。原文在下面。(请注意,创建缩略图的完整解决方案不是100%,因为我认为保存到数据库的缓冲区格式不正确。但是图像成功地以较小的文件大小保存到s3。)

更新的app.js 原始app.js
第一个问题,当您浏览时,您的上传是否出现在s3存储桶中?您不需要返回findById&partyEvent.save&res.send,您没有进行承诺链接。您还需要检查第一个toBuffer(“base64”,函数(err,buf),您是否收到了完整的base64缓冲区?Wayne,S3没有创建任何新对象。我可以提取返回,但这似乎是一个辅助问题。那么putObject或console.log(“将数据上载到AWS S3时出错,err”)中的错误是什么从未运行?不幸的是,上面的代码没有记录任何错误,除了Heroku因缺少响应而中断连接的H13错误。但是,我能够通过将gm上的toBuffer()方法替换为stream()方法来实现我的中心思想。我在aws sdk github站点上找到了一个工作示例。
// PUT
app.put("/api/events/:id", function (req, res){

console.log("PUT: ");

var buffer = new Buffer(req.body.photo, "base64");

var fullsizeBuffer = imageMagick(buffer, "image.jpg")
.quality(60)
.stream(function (err, stdout, stderror) {

if (stderror) {
  console.log("Error in creating an image from a Buffer: ", stderror);
}

var buf = new Buffer(0);

stdout.on("data", function(d) {
  buf = Buffer.concat([buf, d]);
});

stdout.on("end", function() {

  // Connect to AWS to process photo in PUT request
  s3.createBucket({Bucket: "theheartboothTEST"}, function() {

    var params = {
      Bucket: "theheartboothTEST",
      Key: req.body.photoID,
      Body: buf,
      ContentType: "image/jpeg",
      ContentEncoding: "base64",
      ACL: "public-read"
    };

    s3.putObject(params, function(err, data) {

      if (err) {
        console.log("Error uploading data to AWS S3: ", err);
      } else {

        imageMagick(buf, "thumb.jpg")
        .resize(320)
        .stream(function (err, stdout2, stderror2) {

          if (err) {
            console.log("Error in creating an thumbnail from a Buffer: ", err);
          }

          var thumbBuf = new Buffer(0);
          stdout2.on("data", function(d) {
            thumbBuf = Buffer.concat([thumbBuf, d]);
          });

          stdout2.on("end", function() {

            var photo = new PhotoModel({
              photoID : data.ETag,
              url     : "https://s3.amazonaws.com/theheartboothTEST/" + params.Key,
              thumbnail : thumbBuf,
            });

            EventModel.findById(req.params.id, function (err, partyEvent) {
              partyEvent.title        = req.body.title;
              partyEvent.description  = req.body.description;
              partyEvent.date         = req.body.date;
              partyEvent.location     = req.body.location;
              partyEvent.photos.push(photo);

              partyEvent.save(function (err) {
                if (!err) {
                  console.log("updated");
                } else {
                  console.log(err);
                }
                console.log("Successfully uploaded data to S3 Bucket: theheartboothTEST");
                res.send(partyEvent);
              });
            })
          });
        });
      }
    })
  });
});
});
});
var application_root = __dirname,
express = require('express'),
path = require('path'),
mongoose = require('mongoose'),
AWS = require('aws-sdk'),
// fs = require('fs'),
gm = require('gm'),
imageMagick = gm.subClass({ imageMagick: true });

// decode64 = require('base64').decode;
// config = require('./config.json');

var app = express();

// MongoDB Database
var mongoURI = process.env.MONGOLAB_URI;
var db = mongoose.createConnection(mongoURI);

// AWS Session
var s3 = new AWS.S3();

// Config
app.configure(function () {
app.use(express.bodyParser({limit: '6mb'}));
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(application_root, 'public')));
app.use(express.errorHandler({
   dumpexceptions: true,
   showStack: true}));
});

var Schema = mongoose.Schema;

var Photos = new Schema({
  photoID: {type: String, required: true},
  url: {type: String, required: true},
  thumbnail: {type: Buffer, required: false},
});

var PartyEvent = new Schema({
  title: { type: String, required: true },
  description: { type: String, required: true },
  date: { type: Date },
  location: { type: String, required: true },
  photos: [Photos],
});

var PhotoModel = db.model('Photo', Photos);
var EventModel = db.model('Event', PartyEvent);    

app.put("/api/events/:id", function (req, res){

console.log("PUT: ");

var buffer = new Buffer(req.body.photo, "base64");

gm(buffer, "image.jpg")
.quality(80)
.toBuffer("base64", function(err, buf) {

  var params = {
    Bucket: "theheartboothTEST",
    Key: req.body.photoID,
    Body: buf,
    ContentType: "image/jpeg",
    ACL: "public-read"
  };
  s3.putObject(params, function(err, data) {
    if (err) {
      console.log("Error uploading data to AWS S3: ", err);
    } else {

      gm(buffer, "image.jpg")
      .quality(80)
      .resize(320)
      .toBuffer("base64", function(err, thumbBuffer) {

        var photo = new PhotoModel({
          photoID : data.ETag,
          url     : "https://s3.amazonaws.com/theheartboothTEST/" + params.Key,
          thumbnail : thumbBuffer,
        });

        return EventModel.findById(req.params.id, function (err, partyEvent) {
          partyEvent.title        = req.body.title;
          partyEvent.description  = req.body.description;
          partyEvent.date         = req.body.date;
          partyEvent.location     = req.body.location;
          partyEvent.photos.push(photo);

          return partyEvent.save(function (err) {
            if (!err) {
              console.log("updated");
            } else {
              console.log(err);
            }
            console.log("Successfully uploaded data to S3 Bucket: theheartboothTEST");
            return res.send(partyEvent);
          });
        })
      });
    }
  });
});    
});