初学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%左右,开发了一个雏形,如果后期实际项目中遇到再继续完善。

