Following is simple snippet how to download file and upload file (POST method) to Meteor.js. I use iron router as router for Meteor.js.
Download file
Following snippet put to lib/router.js
. It'll execute at server side.
Router.route('/json/items', function() { let headers = { 'Content-Type': 'text/json', 'Content-Disposition': "attachment; filename=items.json" }; let items = Items.find().fetch(); this.response.writeHead(200, headers); return this.response.end(JSON.stringify(items)); }, { name: 'jsonItems', where: 'server' })
Test from command line
wget http://localhost:3000/json/items -O m.json
Upload file
This task is more complicated. First, we need busboy to modify incoming request and add file field.
So, add busboy to package.json
meteor npm install --save busboy
Second, add middleware to server/middleware.js. Following snippet will add filenames
field to iron router's this.request
.
# vim server/middleware.js const Busboy = require("busboy"); const fs = require("fs"); const os = require("os"); const path = require("path"); Router.onBeforeAction((req, res, next) => { let filenames = []; _.extend(req, {postData: {}}); if (req.method == "POST") { let busboy = new Busboy({ headers: req.headers }); busboy.on("file", (fieldname, file, filename, encoding, mimetype) => { let saveTo = path.join(os.tmpDir(), filename); file.pipe(fs.createWriteStream(saveTo)) filenames.push(saveTo) }) busboy.on("field", (fieldname, value) => { req.postData[fieldname] = value; }) busboy.on("finish", () => { req.filenames = filenames; next(); }) req.pipe(busboy); } else { next(); } })
Following snippet put to lib/router.js
. It'll execute at server side.
Router.route('/upload', function() { let result = {status: "OK"}; if (this.request.filenames.length) { const fs = require("fs"); let path = this.request.filenames[0]; // save photo to store let photo = PhotosFS.insert(path); fs.unlink(path); result.photoID = photo._id; } else { result.status = "FAIL"; } let headers = {'Content-Type': 'text/json'}; this.response.writeHead(200, headers); return this.response.end(JSON.stringify(result)); }, { where: 'server', name: 'upload' });
Test from command line
curl -i -F fd=@image.png http://localhost:3000/upload