3

申し訳ありませんが、ここで 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つの選択肢があります(と思います!)

  1. ファイルをアップロード ディレクトリに保存し、後でアクセスできるようにローカル パスを mongodb に保存します。
  2. バッファを使用してファイル自体をMongoDbに保存します
  3. 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();
});

どんな助けでも大歓迎です。ありがとうございました!

4

0 に答える 0