申し訳ありませんが、ここで Node.js を初めて使用します。iphoneクライアントからnode.jsサーバーにファイルをアップロードしてサーバー側に保存するための適切な戦略を理解するのに苦労しています。
今のところ、サーバー上のバイナリ ファイルを受け入れて、次のコードを使用してファイル システムに保存できます。
app.post('/upload', function(req, res){
// get the temporary location of the file
var tmp_path = req.files.pic.path;
// set where the file should actually exists - in this case it is in the "images" directory
var target_path = './uploads/' + req.files.pic.name;
// move the file from the temporary location to the intended location
fs.rename(tmp_path, target_path, function(err) {
if (err) throw err;
// delete the temporary file, so that the explicitly set temporary upload dir does not get filled with unwanted files
fs.unlink(tmp_path, function() {
if (err) throw err;
res.send('File uploaded to: ' + target_path + ' - ' + req.files.pic.size + ' bytes');
});
});
console.log(req.files.pic.name);
res.send('DONE', 200);
res.end();
});
このコードでは、最初に iphone から /tmp ディレクトリへの jpeg のマルチパート フォーム アップロードを受け入れ、次にファイルの名前を変更して ./uploads ディレクトリに移動します。私の問題は、このファイルをDBに保存する方法です。
私が読んだことから、私には3つの選択肢があります(と思います!)
- ファイルをアップロード ディレクトリに保存し、後でアクセスできるようにローカル パスを mongodb に保存します。
- バッファを使用してファイル自体をMongoDbに保存します
- grid-fs を使用してファイルを保存します。
gridfs-stream と呼ばれるこのモジュールを使用して #3 を試しています (マングースを使用しているため) が、パッケージのソース コードがよくわかりません。
私の質問は 2 部構成です。上記の 3 つの選択肢のうち、#3 が実際に進むべき道でしょうか? もしそうなら、gridfs-stream の使い方を理解するための助けが本当に必要です。
次のコードが間違っていることはわかっていますが、これはこれまでのところ、既存のアップロード コードに挿入できるかどうかを確認するための試みです。
app.post('/upload', function(req, res){
// get the temporary location of the file
var tmp_path = req.files.pic.path;
// set where the file should actually exists - in this case it is in the "images" directory
var target_path = './uploads/' + req.files.pic.name;
// move the file from the temporary location to the intended location
fs.rename(tmp_path, target_path, function(err) {
if (err) throw err;
var conn = mongoose.createConnection('localhost', 'myahkvoicedb');
conn.once('open', function () {
var gfs = Grid(conn.db, mongoose.mongo);
// all set!
var writestream = gfs.createWriteStream('req.files.pic.name');
fs.createReadStream('./uploads/').pipe(writestream);
/* // APP CRASHES HERE WITH THE FOLLOWING:
stream.js:81
throw er; // Unhandled stream error in pipe.
^
Error: EISDIR, read
*/
})
// delete the temporary file, so that the explicitly set temporary upload dir does not get filled with unwanted files
fs.unlink(tmp_path, function() {
if (err) throw err;
res.send('File uploaded to: ' + target_path + ' - ' + req.files.pic.size + ' bytes');
});
});
console.log(req.files.pic.name);
res.send('DONE', 200);
res.end();
});
どんな助けでも大歓迎です。ありがとうございました!