0

次のように、アバターをアップロードするためのミドルウェアを作成しました。

var gm = require('gm'),
    mkdirp = require('mkdirp'),
    fs = require('fs');

uploadAvatar = function(req, res, next) {
  var img, path, user;
  if (req.files.avatar_image) {
    user = req.user;
    img = req.files.avatar_image;
    path = __dirname + "/../../public/avatar/" + (user.name.parameterize()) + ".png";
    mkdirp.sync(__dirname + "/../../public/avatar/");
    fs.createReadStream(img.path).pipe(fs.createWriteStream(path));
    gm(path).resize(250, 250).autoOrient().quality(90).write(path, function(err) {
      if (err != null) {
        req.flash('error', err);
      } else {
        user.avatar = "/avatar/" + (user.name.parameterize()) + ".png";
        user.save(function(err) {
          if (err != null) {
            req.flash('error', err);
          }
          next();
        });
      }
    });
  } else {
    next();
  }
};

// Usage
app.post('/upload', ensureAuthenticated, uploadAvatar, handleUpload);

画像をアップロードしようとするnodeと、信じられないほど役立つエラー メッセージが表示されてクラッシュしました。

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: ENOENT, open '/tmp/1126846a248af5c584770b07de649f9b.png'

私もそれを使用する前にファイルをコピーしようとしgmました。「セキュリティ」として、ファイルに触れる前にエクスプレスがファイルを削除すると思われます。

誰でもここで私を助けることができますか?

編集完全なソース

4

1 に答える 1

3

まず、一時ファイルをアバター ディレクトリにコピーします。次に、アバターと一時ディレクトリおよびファイルに対するアクセス許可があることを確認します。

同様に、読み取りストリームから書き込みストリームへのパイプは同期操作ではなく、読み取りハンドルを初期化した後に直接パイプしようとすると、問題が発生する可能性があります。
イベントを追加して、ファイルがコピーされるまで待つ必要があります。

var complete = function(err) {
  if (!err) {
    // process your gm
  } else {
    console.log(err);
  }
}

var read = fs.createReadStream(sourcePath);
read.on('error', function(err) {
  complete(err);
});

var write = fs.createWriteStream(targetPath);
write.on('error', function(err) {
  complete(err);
});
write.on('close', function() {
  complete();
});
read.pipe(write);
于 2013-07-10T09:17:32.030 に答える