Skip to content

Instantly share code, notes, and snippets.

@shimondoodkin
Created August 4, 2010 03:08
Show Gist options
  • Select an option

  • Save shimondoodkin/507573 to your computer and use it in GitHub Desktop.

Select an option

Save shimondoodkin/507573 to your computer and use it in GitHub Desktop.
var sys = require("sys"),
fs = require('fs'),
url = require('url'),
http = require("http"),
multipart = require("./lib/multipart");
http.createServer(function (request, response) {
switch (url.parse(request.url).pathname) {
case '/':
display_form(request, response);
break;
case '/upload':
upload_files(request, response,'./',function(error,data) {
if(error!==null)
{
response.writeHead(200, {'Content-Type': 'text/plain'});
response.write('Multipart Parse Error');
response.end();
}
else
{
response.writeHead(200, {'Content-Type': 'text/plain'});
response.write('Thanks for the upload');
response.end();
}
});
break;
default:
show_404(request, response);
break;
}
}).listen(8124);
function display_form(request, response) {
response.writeHead(200, {'Content-Type': 'text/html'});
response.write(
'<form action="/upload" method="POST" enctype="multipart/form-data">' +
'<input type="file" name="upload-file">' +
'<input type="submit" value="Upload">' +
'</form>'
);
response.end();
}
function upload_files(request, response,folder,callback)
{
request.setEncoding('binary');
var parser = multipart.parser();
parser.headers = request.headers;
var inquee=0,finished=false;
var request_vars=[];
var name, filename, file;
parser.addListener('onPartBegin', function(part)
{
name = part.name;
filename = part.filename;
file = fs.createWriteStream(folder + filename,{ 'flags': 'w', 'encoding': 'binary', 'mode': 0666 });
inquee++;
sys.pump(parser, file , function()
{
sys.debug('file end');
inquee--;
if(finished&&inquee==0) callback(null,request_vars); // if file writing goes beyond parsing, call callback later when done.
});
});
parser.addListener('onEnd', function(part) { finished=true; if(inquee==0) callback(null,request_vars);});
parser.addListener('onError', function(err) { sys.debug(' parser on end '); callback(err,request_vars); });
sys.pump(request, parser, function() { sys.debug('request end'); });
}
function show_404(request, response) {
response.writeHead(404, {'Content-Type': 'text/plain'});
response.write('404 - Please try again.');
response.end();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment