UNPKG

blueimp-file-uploader-express

Version:

This is a File Uploader for Node.js, the project is based on Blueimp jQuery File Upload developed by Sebastian Tschan.

133 lines (108 loc) 3.85 kB
/*jslint node: true*/ "use strict"; var FileInfo = require("./lib/fileinfo.js"), configs = require("./lib/configs.js"), formidable = require("formidable"), fs = require("fs"), path = require("path") ; function uploadService(opts) { var fileUploader = {}, options = configs.apply(opts), transporter = options.storage.type === "local" ? require("./lib/transport/local.js") : require("./lib/transport/aws.js") ; transporter = transporter(options); fileUploader.config = options; function setNoCacheHeaders(res) { res.setHeader("Pragma", "no-cache"); res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); res.setHeader("Content-Disposition", "inline; filename=\"files.json\""); } fileUploader.get = function(req, res, callback) { this.config.host = req.headers.host; setNoCacheHeaders(res); transporter.get(callback); }; fileUploader.post = function(req, res, callback) { setNoCacheHeaders(res); var form = new formidable.IncomingForm(), tmpFiles = [], files = [], map = {}, fields = {}, redirect ; this.config.host = req.headers.host; var configs = this.config; req.body = req.body || {}; function finish(error, fileInfo) { if (error) return callback(error, { files: files }, redirect); if (!fileInfo) return callback(null, { files: files }, redirect); var allFilesProccessed = true; files.forEach(function(file, idx) { allFilesProccessed = allFilesProccessed && file.proccessed; }); if (allFilesProccessed) { callback(null, { files: files }, redirect); } } form.uploadDir = configs.tmpDir; form .on("fileBegin", function(name, file) { tmpFiles.push(file.path); // fix #41 configs.saveFile = true; var fileInfo = new FileInfo(file, configs, fields); map[fileInfo.key] = fileInfo; files.push(fileInfo); }) .on("field", function(name, value) { fields[name] = value; if (name === "redirect") { redirect = value; } }) .on("file", function(name, file) { var fileInfo = map[FileInfo.getFileKey(file.path)]; fileInfo.update(file); if (!fileInfo.validate()) { finish(fileInfo.error); fs.unlink(file.path); return; } transporter.post(fileInfo, file, finish); }) .on("aborted", function() { finish("aborted"); tmpFiles.forEach(function(file) { fs.unlink(file); }); }) .on("error", function(e) { console.log("form.error", e); finish(e); }) .on("progress", function(bytesReceived) { if (bytesReceived > configs.maxPostSize) { req.connection.destroy(); } }) .on("end", function() { //if (configs.storage.type == "local") { // finish(); //} }).parse(req) ; }; fileUploader.delete = function(req, res, callback) { transporter.delete(req, res, callback); }; return fileUploader; } module.exports = uploadService;