如何提供使用CollectionFS在Meteor中存储的PDF文件?
问题描述:
我正在做一个流星申请。如何提供使用CollectionFS在Meteor中存储的PDF文件?
目前,我的服务器上有几个PDF文件。要直接服务于这些已有的PDF文件到客户端,我做这种方式,它工作得很好。
Router.route("/file/:fileName", function() {
var fileName = this.params.fileName;
// console.log(process.env.PWD);
var filePath = process.env.PWD + '/' + fileName;
var fs = Meteor.npmRequire('fs');
var data = fs.readFileSync(filePath);
this.response.writeHead(200, {
"Content-Type": "application/pdf",
"Content-Length": data.length
});
this.response.write(data);
this.response.end();
}, {
where: "server"
});
我节省使用CollectionFS(后来,我将生成PDF文件,并将它们保存这些PDF到蒙戈现在,我只是直接将这些已经存在的PDF保存到Mongo中,因为我首先想让Mongo部分工作。)。
testCollection = new FS.Collection("testCollection", {
stores: [new FS.Store.GridFS("testCollection")]
});
testCollection.allow({
'insert': function() {
return true;
}
});
var file = new FS.File(process.env.PWD + '/PDFKitExampleServerSide.pdf');
file.encoding = 'binary';
file.name('myPDF.pdf');
var document = testCollection.insert(file);
console.log(document._id);
我的问题是,当我使用保存这些CollectionFS PDF文件到蒙戈(就像我上面做的),我该如何检索和服务于这些PDF文件?
Router.route("/database/:pdfId", function() {
//need help here
}, { where: "server"});
答
经过大量的搜索和尝试,我终于得到它的工作。
Router.route("/database/:pdfId", function() {
var pdfId = this.params.pdfId;
var file = testCollection.findOne({_id: pdfId});
var readable = file.createReadStream("tmp");
var buffer = new Buffer(0);
readable.on("data", function(b) {
buffer = Buffer.concat([buffer, b]);
});
var response = this.response;
readable.on("end", function() {
response.writeHead(200, {
"Content-Type": "application/pdf",
"Content-Length": buffer.length
});
response.write(buffer);
response.end();
});
}, {
where: "server"
});