初学nodejs+express,打造cms系统(5)

野生程序猿-杂烧5年前案例分享968

今天来尝试做上传功能,其实就是一个上传接口。已经跟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%左右,开发了一个雏形,如果后期实际项目中遇到再继续完善。

相关文章

nodejs对memcache进行备份与恢复

memcache是个古老的高速缓存工具,前辈们古老的程序还用着。但是市场上没有完美的备份恢复工具,老板让我开发一个。这需求让我两眼一抹黑,完全不知所措。先模拟一下思路,可以telenet到端口上,然后...

nodejs同步操作sqlite3类

electron是基于nodejs的,为了方便electron存储,想到了sqlite这种轻便数据库。作为桌面应用,不像nodejs写服务端,为了简化开发,所以写了个同步的操作sqlite的类库,需要...

nodejs裁剪图片

nodejs裁剪图片

这是个真实的案例,下面脚本是真实跑通的,走过了一些坑,这里来给大家分享一下 首先描述一下场景,我们是做教学软件的,这个是开发一个X光机安检教学场景,有...

初学nodejs+express,打造cms系统(4)

前面已经改造了基础模块,下面到了页面制作环节。先前的脚手架已经支持ejs了,在views文件夹里出现了测试ejs,下面基本上是锻炼自己仿写能力了。【routes/api.js】var exp...

编译的困扰-经验分享

编译的困扰-经验分享

开发的时候我们编译经常遇到坑,一会要用python3,一会又要用python 2.7的情况,nodejs一会要这个版本,一会要那个版本的情况,甚至npm都有版本要求。...

初学nodejs+express,打造cms系统(3)

上次聊到了我的base.js 插入式编程,接着聊编程正题首先是数据库操作类【db_mysql.js】var mysql=require('mysql');  va...