Skip to content

Instantly share code, notes, and snippets.

@secretfader
Created January 26, 2015 20:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save secretfader/2b0dd63b6da653db6f06 to your computer and use it in GitHub Desktop.
Save secretfader/2b0dd63b6da653db6f06 to your computer and use it in GitHub Desktop.
A simple, Busboy-powered streaming file upload interface.
var util = require('util')
, path = require('path')
, Busboy = require('busboy')
, Emitter = require('events').EventEmitter
, Uploader;
Uploader = function () {
Emitter.call(this);
};
util.inherits(Uploader, Emitter);
Uploader.prototype.onField = function (field, value, fTrunc, vTrunc) {
this.emit('field', field, value, fTrunc, vTrunc);
};
Uploader.prototype.onFile = function (field, stream, name, enc, mime) {
this.emit('file', field, stream, name, enc, mime);
};
Uploader.prototype.onError = function (err) {
this.emit('error', err);
};
Uploader.prototype.onFinish = function (body, files) {
this.emit('finish', body, files);
};
Uploader.prototype.parse = function (headers) {
var self = this
, body = {}
, files = {};
self.parser = self.parser || new Busboy({ headers: headers });
self.parser.on('error', function (err) {
self.onError(err);
});
self.parser.on('field', function (field, value, fTrunc, vTrunc) {
body[field] = value;
self.onField(field, value, fTrunc, vTrunc);
});
self.parser.on('file', function (field, stream, name, enc, mime) {
if (!name) return stream.resume();
if (!self.fields) return self.onFile(field, stream, name, enc, mime);
if (self.fields && self.fields[field]) {
var ext = path.extname(name).replace('.', '');
if (self.fields[field].length &&
self.fields[field].indexOf(ext) !== -1) {
files[field] = name;
self.onFile(field, stream, name, enc, mime);
} else {
self.onError(new Error('Validation of ' + field + ' failed.'));
stream.resume();
}
}
});
self.parser.on('finish', function () {
self.onFinish(body, files);
});
return self;
};
module.exports = Uploader;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment