初学nodejs+express,打造cms系统(5)
今天来尝试做上传功能,其实就是一个上传接口。已经跟php完全两样了,两眼一抹黑,直接百度搜索出来拿过来用,也不知道性能如何,反正可以跑通,需要找机会验证一下。
【upload.js】
//api库 管理员 var fs = require('fs'); var multiparty = require('multiparty'); var path = require('path') var api={ init(base,$model,$ac){ eval(require('./api_base').ready()); } ,action:{ index(){ var me=this; var res=me.res; var req=me.req; /* 生成multiparty对象,并配置上传目标路径 */ var form = new multiparty.Form(); var $type=me.base.fun.str(req.query["type"]); /* 设置编辑 */ form.encoding = 'utf-8'; //设置文件存储路劲 form.uploadDir = './upload'; //设置文件大小限制 form.maxFilesSize = 1024 * 1024 * 1024; // form.maxFields = 1000; //设置所有文件的大小总和 //上传后处理 form.parse(req, function(err, fields, files) { var output={success:false,url:url,picurl:url,msg:'上传失败'}; var filesTemp = JSON.stringify(files, null, 2); if(err) { console.log('parse error:' + err); }else { var uploadedPath = files['file'][0]['path']; uploadedPath=path.resolve(__dirname, '..')+'/'+uploadedPath; path_old=uploadedPath.replace(/\\/g,'/'); var www_path=path.resolve(__dirname, '..')+'/bin/wwwroot'; var date_dir=me.base.fun.date(1); var houzhuiming=me.base.fun.get_houzhuiming(uploadedPath); var new_name=me.base.fun.date('yyyyMMddhhmmss')+'_'+me.base.fun.randnum(10)+'.'+houzhuiming; var mkdir_result=me.base.fun.mkdir(www_path+`/upload/${date_dir}/`); var url=`upload/${date_dir}/${new_name}`; var path_new = www_path+'/' + url; path_new=path_new.replace(/\\/g,'/'); console.log(path_old); console.log(path_new); //重命名为真实文件名 var rename_result=me.base.fun.rename(path_old, path_new); var unlink_result=me.base.fun.unlink(path_old); console.log(mkdir_result); console.log(rename_result); console.log(unlink_result); if($type=='') { if(rename_result) { var output={success:true,url:url,picurl:url,msg:'上传成功'}; }else{ var output={success:false,url:url,picurl:url,msg:'上传失败'}; } }else if($type=='editor_tinymce'){ if(rename_result) { var output={success:true,location:'/'+url,url:url,picurl:url,msg:'上传成功'}; }else{ var output={success:false,url:url,picurl:url,msg:'上传失败'}; } }else{ var output={success:false,url:url,picurl:url,msg:'上传失败'}; } } res.json(output); }) } } }; module.exports = api;
再来个excel.js
//excel var nodeExcel = require('excel-export'); var xlsx = require('xlsx'); var excel={ str(value){ try{ if(typeof(value)=='undefined' ) { var result=''; }else{ var result=value; } }catch(e){ var result=''; } return result+''; } ,export(_headers,data,mysheet){ console.log('export'); var conf ={}; conf.name = mysheet; conf.cols = []; for(var key in _headers){ var col = {}; col.caption = _headers[key]; col.type = 'string'; col.width=28; conf.cols.push(col); } var rows=[]; for(var i in data) { var this_arr=[]; for(var key in _headers){ this_arr.push(this.str(data[i][key])); } rows.push(this_arr); } conf.rows = rows; console.log(conf); var result = nodeExcel.execute(conf); return result; } ,res_excel(res,_headers,data,mysheet,name) { console.log('res_excel'); console.log(_headers); console.log(data); if(!name) { var name=(new Date()).valueOf(); } name=encodeURI(name); if(!mysheet) { var mysheet='mysheet'; } var result=this.export(_headers,data,mysheet); res.setHeader('Content-Type', 'application/vnd.openxmlformats'); res.setHeader("Content-Disposition", "attachment; filename=" + name+".xlsx"); res.end(result, 'binary'); } ,read(path) { let workbook = xlsx.readFile(path); //workbook就是xls文档对象 let sheetNames = workbook.SheetNames; //获取表明 let sheet = workbook.Sheets[sheetNames[0]]; //通过表明得到表对象 var data =xlsx.utils.sheet_to_json(sheet); //通过工具将表对象的数据读出来并转成json return data; } }; module.exports = excel;
部分模板 页面细节没有贴出来,整体其实翻的php的,为了像php那样拥有全局变量,所以很多挂载到base上实现的功能,其目的也是为了简化开发。虽然开发水平比较次,但是还是带着框架思路的。目前没有实现php框架100%的功能,只实现了80%左右,开发了一个雏形,如果后期实际项目中遇到再继续完善。