How to upload files using nodejs and HAPI?
For new readers, hapi already using multiparty uses pez to handle multipart post requests. From hapi documentation;
If the payload is 'multipart/form-data' and parse is true, fields values are presented as text while files are provided as streams. File streams from a 'multipart/form-data' upload will also have a property hapi containing filename and headers properties.
Example;
server.route({ method: 'POST', path: '/create', config: { payload:{ maxBytes: 209715200, output:'stream', parse: true }, handler: function (request, reply) { request.payload["htmlInputName"].pipe(fs.createWriteStream("test")); }});
You can visit for working code in https://github.com/pandeysoni/Hapi-file-upload-download
/* * upload file */exports.uploadFile = { payload: { maxBytes: 209715200, output: 'stream', parse: false }, handler: function(requset, reply) { var form = new multiparty.Form(); form.parse(requset.payload, function(err, fields, files) { if (err) return reply(err); else upload(files, reply); }); }};/* * upload file function */var upload = function(files, reply) { fs.readFile(files.file[0].path, function(err, data) { checkFileExist(); fs.writeFile(Config.MixInsideFolder + files.file[0].originalFilename, data, function(err) { if (err) return reply(err); else return reply('File uploaded to: ' + Config.MixInsideFolder + files.file[0].originalFilename); }); });};
Finally I got the solution to upload the large files using HAPI and Thanks to Roman.
Here is the solution:
server.js code
server.route({ method: 'POST', path: '/api/uploadfiles', config: { payload:{ maxBytes:209715200, output:'stream', parse: false }, handler: currentposition.uploadFiles, }});
Handler code:
var currentpositionApi = { fs : require('fs'), multiparty: require('multiparty'), uploadFiles:function(req,reply){ var form = new currentpositionApi.multiparty.Form(); form.parse(req.payload, function(err, fields, files) { currentpositionApi.fs.readFile(files.upload[0].path,function(err,data){ var newpath = __dirname + "/"+files.upload[0].originalFilename; currentpositionApi.fs.writeFile(newpath,data,function(err){ if(err) console.log(err); else console.log(files) }) }) console.log(files) }); }}