3

フレームワーク: node.js/express.js/busboy/gridfs-stream(mongodb)

busboy を使用してファイルをアップロードしてから、gridfs-stream を使用してファイルを mongodb gridfs に保存しています。

                req.pipe(req.busboy);
                req.busboy.on('file', function (bus_fieldname, bus_file, bus_filename) {

                var writestream = gfs.createWriteStream({
                    filename: bus_filename,
                });

                bus_file.pipe(writestream);

                writestream.on('close', function (file) {
                    res.redirect('/xxxxx/');
                });
            });

ダウンロードは簡単です。gridfs-stream の createReadStream を使用します。mongodb からコンテンツを読み取り、次のコードを使用してブラウザーに送信します。

            gfs.findOne({_id: attachmentid}, function (err, file) {
            if (err || !file){
                res.send(404);
            }else{
                var fileName = file.filename;
                var readstream = gfs.createReadStream({_id: attachmentid});
                var buffer = "";
                readstream.on("data", function (chunk) {
                    buffer += chunk;
                });

                // dump contents to buffer
                readstream.on("end", function () {
                    res.set("Content-Disposition","attachment; filename=" + fileName);
                    res.send(buffer);
                });

            }

問題: 90kb の pdf ファイルをアップロードすると、正常にアップロードされます。サイズはmongodbで正しいことがわかります。しかし、ダウンロードすると、ダウンロードしたファイルのファイルサイズは約165kbです。不一致があります。これは、テキスト ファイルでは発生しません。確かにデータ型と関係があります。

誰でも助けてもらえますか?

4

2 に答える 2

3

gfs 読み取りストリームを直接応答にパイプします。これは私のために働くものです

res.set("Content-Disposition","attachment; filename=" + fileName);
var readstream = gfs.createReadStream({_id: attachmentid});
readstream.pipe(res);
于 2015-07-02T07:07:58.790 に答える
1

サシカンスが言ったように、配管で問題を解決でき、それが最善のアプローチです。

しかし、現在のアプローチの何が問題なのか疑問に思っている場合は、バッファのドキュメントを読むことをお勧めします。変数に名前を付けていますbufferが、文字列を割り当てています。

次に、dataコールバックで、Buffer を使用して文字列を追加します。これを行うと、chunkバッファはそのtoString()メソッドを使用して文字列に変換されます。したがって、バイナリ データは utf8 でエンコードされた文字列に変換され、ここで問題が発生します。utf8 はマルチバイト エンコーディングであるため、出力サイズが大きくなります (この変換の正確なメカニズムはわかりません)。

したがって、正しい方法は、バッファに保持することです。

var buffers = [];
readstream.on("data", function (chunk) {
    buffers.push(chunk)
});


readstream.on("end", function () {
    res.set("Content-Disposition","attachment; filename=" + fileName);
    res.send(Buffer.concat(buffers));
});
于 2015-07-02T09:15:27.430 に答える