1

Node を使用して、受信した画像を取得して Mongo の GridFS に保存する、すばやく簡単な画像アップロード サービスを構築しようとしています。

GridFS get には Buffer オブジェクトが必要NodeJS Mongo Driver GridFS put

質問は非常に単純です。受信したリクエスト本文を適切なバッファーに正確にキャスト/変換するにはどうすればよいですか。

これまでの私のコード (重要な部分のみ): api.js

var express = require('express');
var connect = require('connect');

var app = module.exports = express.createServer();

app.configure(function(){
  app.use(express.bodyParser()); 
  app.use(express.methodOverride());
  app.use(app.router);
});

var upload = require('./upload.js');
app.post('/upload', upload.upload);

upload.js

exports.upload = (function(req, res, next){
  console.log("Uploading image...");
  // Create buffer
  // Rest of the code
}

私はもう試した:

  var buffer = new Buffer(util.inspect(req.body),'binary');

バッファーを作成しますが、util.inspect は明らかに正しい方法ではないため、サイズが正しくなく、おそらく正しい内容ではありません。

そして: var buffer = new Buffer(req.body); 結果:

 [Decode error - output not utf-8][Decode error - output not utf-8]

バッファ長 = 0

私は一般的に Node と JavaScript の両方の開発にまったく慣れていないので、おそらく非常に単純なものが欠けている可能性があります。

ありがとう!

4

1 に答える 1

4

最初に、Express はConnectの上に構築されていることを思い出してください。Connect は、大量の下位レベルの HTTP 作業を処理するライブラリであり、それがどこbodyParser()から来たのかを示しています。

ボディ パーサー ミドルウェアは、内部でFormidableを使用してファイルのアップロードを解析します。

Formidable のデフォルトの動作は、アップロードされたファイルをディスクに直接書き込むことです。つまり、ルート ハンドラ内でアップロードされたファイル ストリームに実際にアクセスすることはできません。<input>で送信される通常のフォーム フィールドの値を取得しreq.body、 を介してアップロードされたファイル パスをreq.files取得しますが、ファイル コンテンツは取得しません。

ここでの簡単な答えは、ディスクからファイルを読み取り、それを使用して Mongo に保存することです。完了したら一時ファイルを削除することを忘れないでください。もちろん、これにより、ファイルのアップロードを一時フォルダーに書き込んでから Mongo にロードするという不要な中間ステップが発生します。

ファイル データを Mongo に直接ストリーミングしたい場合は、さらに多くの課題が待ち受けています。アップロード ストリームを解析するには、独自のミドルウェアを作成する必要があります。

これは実際には比較的簡単です。内部の Connect ボディ パーサーの実装から始めて (Formidable を使用して面倒な作業を行います)、onPart APIを使用してストリームをルート ハンドラーに戻して、Mongo ドライバーに渡すことができます。

于 2012-07-22T03:35:51.593 に答える