forked from sheetjs/sheetjs
		
	
		
			
	
	
		
			86 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			86 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||
|  | var fs = require('fs'); | ||
|  | var URL = require('url'); | ||
|  | var child_process = require('child_process'); | ||
|  | var micro = require('micro'), formidable = require('formidable'); | ||
|  | var logit = require('./_logit'), cors = require('./_cors'); | ||
|  | var json2csv = require('json2csv'); | ||
|  | var data = "a,b,c\n1,2,3".split("\n").map(function(x) { return x.split(","); }); | ||
|  | var xlsx = '../../bin/xlsx.njs'; | ||
|  | 
 | ||
|  | function get_data(req, res, type) { | ||
|  | 	var file = "_tmp." + type; | ||
|  | 
 | ||
|  | 	/* prepare CSV */ | ||
|  | 	var csv = json2csv({data:data, hasCSVColumnTitle:false}); | ||
|  | 
 | ||
|  | 	/* write it to a temp file */ | ||
|  | 	fs.writeFile('tmp.csv', csv, function(err1) { | ||
|  | 
 | ||
|  | 		/* call xlsx to read the csv and write to another temp file */ | ||
|  | 		child_process.exec(xlsx+' tmp.csv -o '+ file, function(err, stdout, stderr){ | ||
|  | 			cors(req, res); | ||
|  | 			/* read the new file and send it to the client */ | ||
|  | 			micro.send(res, 200, fs.readFileSync(file)); | ||
|  | 		}); | ||
|  | 	}); | ||
|  | } | ||
|  | 
 | ||
|  | function get_file(req, res, file) { | ||
|  | 	var csv = json2csv({data:data, hasCSVColumnTitle:false}); | ||
|  | 	fs.writeFile('tmp.csv', csv, function(err1) { | ||
|  | 		/* write to specified file */ | ||
|  | 		child_process.exec(xlsx+' tmp.csv -o '+file, function(err, stdout, stderr) { | ||
|  | 			cors(req, res); | ||
|  | 			micro.send(res, 200, "wrote to " + file + "\n"); | ||
|  | 		}); | ||
|  | 	}); | ||
|  | } | ||
|  | 
 | ||
|  | function post_data(req, res) { | ||
|  | 	var form = new formidable.IncomingForm(); | ||
|  | 	form.on('file', function(field, file) { | ||
|  | 		/* file.path is the location of the file in the system */ | ||
|  | 		child_process.exec(xlsx+' --arrays ' + file.path, post_cb(req, res)); | ||
|  | 	}); | ||
|  | 	form.parse(req); | ||
|  | } | ||
|  | 
 | ||
|  | function post_file(req, res, file) { | ||
|  | 	child_process.exec(xlsx+' --arrays ' + file, post_cb(req, res)); | ||
|  | } | ||
|  | 
 | ||
|  | function post_cb(req, res) { | ||
|  | 	return function(err, stdout, stderr) { | ||
|  | 		cors(req, res); | ||
|  | 		/* xlsx --arrays writes JSON to stdout, so parse and assign to data var */ | ||
|  | 		data = JSON.parse(stdout); | ||
|  | 		console.log(data); | ||
|  | 		return micro.send(res, 200, "ok\n"); | ||
|  | 	}; | ||
|  | } | ||
|  | 
 | ||
|  | function get(req, res) { | ||
|  | 	var url = URL.parse(req.url, true); | ||
|  | 	if(url.pathname.length > 1) micro.send(res, 404, "File not found"); | ||
|  | 	else if(url.query.t) get_data(req, res, url.query.t); | ||
|  | 	else if(url.query.f) get_file(req, res, url.query.f); | ||
|  | 	else micro.send(res, 403, "Forbidden\n"); | ||
|  | } | ||
|  | 
 | ||
|  | function post(req, res) { | ||
|  | 	var url = URL.parse(req.url, true); | ||
|  | 	if(url.pathname.length > 1) micro.send(res, 404, "File not found"); | ||
|  | 	else if(url.query.f) post_file(req, res, url.query.f); | ||
|  | 	else post_data(req, res); | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = function(req, res) { | ||
|  | 	logit(req, res); | ||
|  | 	switch(req.method) { | ||
|  | 		case 'GET': return get(req, res); | ||
|  | 		case 'POST': return post(req, res); | ||
|  | 	} | ||
|  | 	return micro.send(res, 501, "Unsupported method " + req.method + "\n"); | ||
|  | }; |