nodejs实现上传下载,以及部分安装部署

       前端时间有个需求,领导让做个上传下载的页面,好适配他后台c语言生成license的功能,需要独立部署到Linux服务器。我思考许久,因为就一个页面部署,所以采用传统的Tomcat部署的工程肯定是不适合需求的,并且一般的js不能直接在linux服务器执行后台命令,所以我再查询前端技术后,觉得用node js 是最合适的,因为这样既不用麻烦前端容器,并且还能执行后台命令,最主要的是对流的操作有着相当的性能(nodejs相对于需要使用大量的计算的工程,性能不是很好),因此准备做一个nodejs的页面工程。

     下面是我的页面的截图(该图片已经运用于项目,请勿直接套用商业用途):

主要功能介绍,上传一个请求文件,然后日期在不手动填写的情况下,默认是当天至一百年后。然后点击生成license按钮,实现上传并生成license,最后把生成好得license下载下来。

       下面我们介绍一下怎样搭建nodejs工程(webstorm):

注意:创建nodejs前,需要先添加nodejs和express。请参考其他文档

因为我们只有一个页面,和一个server。所以我们可以删除路由和其余相关的文件夹,并且改造app.js,下面是我工程server的全部代码:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

// 此方法用于在浏览器访问我们的IP时所要反回的界面
app.get("/", function (req, res) {
    res.sendFile(__dirname + "/Index.html");
});

app.get("/Images/logo.png", function (req, res) {
    res.sendFile(__dirname + "/Images/logo.png");
});

//此方法用于返回一个yyyyMMdd格式的日期
function getyyyyMMdd(date){
    var d = new Date(date);
    var curr_date = d.getDate();
    var curr_month = d.getMonth() + 1;
    var curr_year = d.getFullYear();
    String(curr_month).length < 2 ? (curr_month = "0" + curr_month): curr_month;
    String(curr_date).length < 2 ? (curr_date = "0" + curr_date): curr_date;
    var yyyyMMdd = curr_year + "" + curr_month +""+ curr_date;
    return yyyyMMdd;
}
//用于生产license的方法
function creatlicense(time,deadtime,req,res,currentTime,filename) {
    console.log("进入了生成license方法:"+time);
    console.log(deadtime);
    console.log(currentTime);
    //1.首先判断是否有生成license必备的文件
    var Uploder = __dirname +'/Images/imgUploader_'+currentTime+'_'+filename;
    if(!fs.existsSync(Uploder)){
        return res.end("Please upload the file");
    }else{
        //2.判断时间使用期限是否正确
        var olddate =  new Date(time);
        var olddeaddate = new Date(deadtime);
        var date = getyyyyMMdd(olddate.getTime());
        var deaddate = getyyyyMMdd(olddeaddate.getTime());
        console.log(date);
        console.log(deaddate)
        if(olddate.getTime() > olddeaddate.getTime()){
            return res.end("Time error");
        }else{

            //用于生成license
            var name='license_'+currentTime+'.pem';
            var shell = “此处填写需要执行的后台命令”
            console.log(shell);
            //nodejs用于执行linux命令
            process.exec(shell,function (error, stdout, stderr) {
                if (error !== null) {
                    console.log('exec error: ' + error);
                }else{
                    console.log(__dirname + '/license/'+name);
                    //下载(对,你没有看错,就是这一句代码)
                    res.download(__dirname + '/license/'+name, 'license', function(err){
                        if (err) {
                            return res.end("Something went wrong!");
                        }})
                }
            });
        }
    }
}
//点击创建按钮后....
app.post("/api/Upload", function (req, res) {
    var currentTime=null;
    var time=null;
    var deadtime=null;
    var currentTime = null;
    var filename = null;
    var form = new formidable.IncomingForm();
//form表单提交的编码为二进制,enctype="multipart/form-data",接收后转成json格式
    form.parse(req, function(err, fields, files) {
        console.log('fields',fields);//表单传递的input数据
        console.log(fields.otime);
        console.log(fields.deadtime);
        time = fields.otime
        deadtime=fields.deadtime
    });
//上传文件的编码
    var Storage = multer.diskStorage({
        //上传后需要放文件的地址
        destination: function (req, file, callback) {
            callback(null, "./Images");
        },
        //上传后的文件名
        filename: function (req, file, callback) {
            currentTime=Date.now()
            console.log(currentTime)
            filename = file.originalname
            callback(null, file.fieldname + "_" + currentTime +"_"+ file.originalname);
        }
    });

    var upload = multer({ storage: Storage }).array("imgUploader", 3);

    upload(req, res, function (err) {
        if (err) {
            return res.end("Something went wrong!");
        }
    });
//上传后延迟执行生成license的方法
    setTimeout(function () {
        creatlicense(time,deadtime,req,res,currentTime,filename)
    },500)
});
//启动8080端口
app.listen(8080, function (a) {
    console.log("Listening to port 8080");
});

下面是html代码:

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>License</title>
    <script language="javascript" type="text/javascript">
        window.onload= function(){
            var now = new Date();
            var year = now.getFullYear(); //得到年份
            var month = now.getMonth();//得到月份
            var date = now.getDate();//得到日期
            month = month + 1;
            if (month < 10) month = "0" + month;
            if (date < 10) date = "0" + date;
            var time = "";
            var deadtime = "",
                time = year + "-" + month + "-" + date;
            document.getElementById("otime").value=time;
            var years=parseInt(year)
            years = years+100;
            deadtime = years + "-" + month + "-" + date;
            document.getElementById("deadtime").value=deadtime;

            var fileUploader = document.getElementById('FileUploader');
            var pathDisplayer = document.getElementById('PathDisplayer');
            if(fileUploader.addEventListener){
                fileUploader.addEventListener('change', fileUploaderChangeHandler, false);
            }else if(fileUploader.attachEvent){
                fileUploader.attachEvent('onclick', fileUploaderClickHandler);
            }else{
                fileUploader.onchange = fileUploaderChangeHandler;
            }
            function fileUploaderChangeHandler(){
                pathDisplayer.value = fileUploader.value;
            }
            function fileUploaderClickHandler(){
                setTimeout(function(){
                    fileUploaderChangeHandler();
                }, 0);
            }
        }
    </script>
    <style>
        .body {
            background: #393946;
            min-height: 720px;
            min-width: 1200px;
        }
        .banner{
            height: 70px;
            padding-top: 70px;
            padding-right: 0px;
            padding-left: 150px;
        }
        .div-box{
            background: #FFFFFF;
            height: 350px;
            width: 640px;
            margin-top: 70px;
            margin-right: auto;
            margin-bottom: 0px;
            margin-left: auto;
            border-top-left-radius: 5px;
            border-top-right-radius: 5px;
            border-bottom-right-radius: 5px;
            border-bottom-left-radius: 5px;
            text-align: center;
        }
        .div-box h1{
            font-size: 35px;
            text-align: center;
            color: #6D6D6D;
            padding-top: 30px;
            font-weight: normal;
        }
        .div-box form{
         padding-top: 10px;

        }
        .input-text1{
            margin-bottom: 10px;
            border-top-left-radius: 5px;
            border-top-right-radius: 5px;
            border-bottom-right-radius: 5px;
            border-bottom-left-radius: 5px;
            background: #FFFFFF;
            border:1px solid #d4d4d4;
        }
        .input-text{
            margin-bottom: 10px;
            border-top-left-radius: 5px;
            border-top-right-radius: 5px;
            border-bottom-right-radius: 5px;
            border-bottom-left-radius: 5px;
            background: #FFFFFF;
            border:1px solid #d4d4d4;
            padding-left: 80px;
        }
        .btn{
            width: 180px;
            border-radius: 5px;
            background: #bdc2ca;
            color: #fff;
            font-size: 25px;
            text-align: center;
            line-height: 35px;
            padding: 0;
            border: none;
            margin-top: 10px;
        }
    </style>
</head>
<body class = "body">
<div class="banner">
    <img src="Images/logo.png">
</div>
<div class="div-box">
    <h1>License</h1>
    <div class="form">
        <form id="frmUploader"  enctype="multipart/form-data" action="/api/Upload" method="post">
            <div class="file-uploader-wrap">
                <span id="span">上传证书: <input type="text" id="PathDisplayer" style="width:240px;line-height: 22px;"class="input-text1" disabled /></span>
                <input type="file"  name="imgUploader" style="width:70px" id="FileUploader" />
            </div>
            <p>生效日期: <input  type="date" id="otime" style="width:235px;line-height: 22px;" class="input-text" name="otime"   ></input></p>
            <p>失效日期: <input  type="date" id="deadtime"style="width:235px;line-height: 22px;" class="input-text"name="deadtime"  ></input></p>
            <input id="create" class="btn" type="submit" name="submito" value=" create license" />
        </form>
    </div>
</div>
</body>
</html>
主体代码就是这样,剩下的就是建立好相应的文件夹,然后需要注意的是nodejs工程在部署后
(部署需要安装相应的第三文件,此处不做介绍),在文件目录下找到appjs,运行node app.js 看到端口
启动成功没有报错就可以访问了。
注意:上面那样执行后,你会发现如果你的xshell断掉,就会发现再也没有这个端口,也就不能访问了,
因此我们需要实现在xshell启动后,可以关闭连接的窗口后同样能访问程序。

nodejs一般是当成一条用户命令执行的,当用户断开客户连接,运用也就停了,很烦人。如何让nodejs应用当成服务,在后台执行呢?

最简单的办法:

$ nohup node app.js &

但是,forever能做更多的事情,比如分别记录输出和错误日志,比如可以在js中作为api使用。

$ sudo npm install forever -g   #安装
$ forever start app.js          #启动
$ forever stop app.js           #关闭
$ forever start -l forever.log -o out.log -e err.log app.js   #输出日志和错误

命令语法及使用 https://github.com/nodejitsu/forever

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://mp.csdn.net/postedit/80477620

猜你喜欢

转载自blog.csdn.net/lixiwoaini/article/details/80477620