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");
							 | 
						||
| 
								 | 
							
								};
							 |