• angular2^ typescript 将 文件和Json数据 合并发送到服务器(2.服务端)


    nodejs 中使用框架 

    express web框架
    multer 文件接受
    直接贴代码了,我就不解释了 
    "use strict";
    exports.__esModule = true;
    var express = require("express");
    var bodyParser = require("body-parser");
    var multer = require('multer');
    var morgan = require("morgan");
    var path = require("path");
    var CryptoJS = require('../lib/aes');
    var CONFIG = require('../lib/config');
    var fs = require("fs");
    var app = express();
    app.use(morgan('dev'));
    //json类型boby
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(bodyParser.json());
    app.use('/', express.static(path.join(__dirname, '..', 'client')));
    
    // app.use(bodyParser.json());
    // app.use(bodyParser.json({limit: '50mb'}));
    // app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
    // query string 类型body
    //app.use(bodyParser.urlencoded({extended:false}));
    
    
    
    function Encrypt(word, key, iv) {
        var srcs = CryptoJS.enc.Utf8.parse(word);
        var encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
        //return encrypted.ciphertext.toString();
        return encrypted.toString();
    }
    
    function Decrypt(word, key, iv) {
        var encryptedHexStr = CryptoJS.enc.Hex.parse(word);
        var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
        var decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
        var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
        return decryptedStr.toString();
    }
    
    /**
     * 上传文件
     * @param files     经过formidable处理过的文件
     * @param req        httpRequest对象
     * @param postData    额外提交的数据
     */
    function uploadFile(files, req, postData) {
        var boundaryKey = Math.random().toString(16);
        var endData = '
    ----' + boundaryKey + '--';
        var filesLength = 0, content;
    
        // 初始数据,把post过来的数据都携带上去
        content = (function (obj) {
            var rslt = [];
            Object.keys(obj).forEach(function (key) {
                var arr = ['
    ----' + boundaryKey + '
    '];
                arr.push('Content-Disposition: form-data; name="' + key + '"
    
    ');
                arr.push(obj[key]);
                rslt.push(arr.join(''));
            });
            return rslt.join('');
        })(postData);
    
        // 组装数据
        Object.keys(files).forEach(function (key) {
            if (!files.hasOwnProperty(key)) {
                delete files.key;
                return;
            }
            //第一个文件合并参数提交,后续文件提交自身参数
            if (key == 0) {
                content += '
    ----' + boundaryKey + '
    ' +
                    'Content-Type: application/octet-stream
    ' +
                    'Content-Disposition: form-data; name="' + files[key].fieldname + '"; ' +
                    'filename="' + files[key].filename + '"; 
    ' +
                    'Content-Transfer-Encoding: binary
    
    ';
                files[key].contentBinary = new Buffer(content, 'utf-8');
                filesLength += files[key].contentBinary.length + fs.statSync(files[key].path).size;
            } else {
                content = '
    ----' + boundaryKey + '
    ' +
                'Content-Type: application/octet-stream
    ' +
                'Content-Disposition: form-data; name="' + files[key].fieldname + '"; ' +
                'filename="' + files[key].filename + '"; 
    ' +
                'Content-Transfer-Encoding: binary
    
    ';
            files[key].contentBinary = new Buffer(content, 'utf-8');
            filesLength += files[key].contentBinary.length + fs.statSync(files[key].path).size;
            }
        });
    
        req.setHeader('Content-Type', 'multipart/form-data; boundary=--' + boundaryKey);
        req.setHeader('Content-Length', filesLength + Buffer.byteLength(endData));
    
        // 执行上传
        var allFiles = Object.keys(files);
        var fileNum = allFiles.length;
        var uploadedCount = 0;
        var doUpload = function () {
            req.write(files[uploadedCount].contentBinary);
            var fileStream = fs.createReadStream(files[uploadedCount].path, { bufferSize: 4 * 1024 });
            fileStream.on('end', function () {
                // 上传成功一个文件之后,把临时文件删了
                fs.unlink(files[uploadedCount].path);
                uploadedCount++;
                if (uploadedCount == fileNum) {
                    // 如果已经是最后一个文件,那就正常结束
                    req.end(endData);
                } else {
                    doUpload();
                }
            });
            fileStream.pipe(req, { end: false });
        }
        doUpload();
    }
    
    
    app.all('*', function (req, res, next) {
        res.header('Access-Control-Allow-Origin', '*');
        res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
        res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
        res.setHeader('Access-Control-Allow-Credentials', true);
        if (req.method == 'OPTIONS') {
            res.send(200); /让options请求快速返回/
        }
        else {
            next();
        }
    });
    
    var DIR = './uploads/';
    
    // var upload = multer({ dest: DIR });
    
    // app.use(multer({
    //     dest: DIR,
    //     rename: function (fieldname, filename) {
    //         return filename + Date.now();
    //     },
    //     onFileUploadStart: function (file) {
    //         console.log(file.originalname + ' is starting ...');
    //     },
    //     onFileUploadComplete: function (file) {
    //         console.log(file.fieldname + ' uploaded to  ' + file.path);
    //     }
    // }));
    
    
    // 文件上传插件
    
    var storage = multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, DIR)
        },
        filename: function (req, file, cb) {
            cb(null, file.originalname)
        }
    });
    var upload = multer({ storage: storage });
    var cpUpload = upload.any();
    app.use(cpUpload);
    
    
    app.post('/serverH5', function (req, res) {
    
    
        var param = req.body.param;
        var cmd = req.body.cmd;
    
        if (!param || !cmd) {
            res.send(200, {
                State: 1,
                Msg: "server msg : cmd or param null",
                Value: ""
            });
            return;
        }
    
        console.log("cmd>>" + cmd + "
    ");
        console.log("param>>" + param + "
    ");
    
        var key = CryptoJS.enc.Utf8.parse(CONFIG.key);
        var iv = CryptoJS.enc.Utf8.parse(CONFIG.iv);
        var host = "***.*****.com";
        var tag = ***;
        var path = CONFIG.path;
    
        var requestData = {
            "cmd": cmd,
            "p": JSON.parse(param),
            "unix": new Date().getTime()
        };
        var sign = Encrypt(JSON.stringify(requestData), key, iv);
        var sendData = require('querystring').stringify({ key: sign });
    
        var options = {
            method: "POST",
            host: host,
            port: 80,
            path: path,
            headers: {
                "Content-Type": 'application/x-www-form-urlencoded',
                "Content-Length": sendData.length,
                "tag": tag,
                "language": "zh",
                "version": "1"
            }
        };
    
        // options.path = 'http://' + options.host + ':' + options.port + options.path;
        // options.headers.host = options.host;
        // options.host = '127.0.0.1';
        // options.port = 8888;
    
        var http = require('http');
        var reqHppts = http.request(options, function (serverFeedback) {
            if (serverFeedback.statusCode == 200) {
                var body = "";
                serverFeedback.on('data', function (data) {
                    body += data;
                })
                    .on('end', function () {
                        console.log(new Date().toString() + ' res:>>', body);
                        res.send(200, body);
                    });
            }
            else {
                res.send(500, "error");
            }
        });
        reqHppts.on('error', function (e) {
            console.log('error', e.message);
        });
    
    
        //判断是否需要 文件+参数 合并上传
        if (req.files) {
            console.log("find file need upload!");
            uploadFile(req.files, reqHppts, { key: sign });
        } else {
            // write data to request body
            reqHppts.write(sendData);
            reqHppts.end();
        }
    
    });
    var PORT = process.env.PORT || 3000;
    
    var server = app.listen(PORT, '192.168.1.56', function () {
        console.log(new Date().toString() + "h5 server start ok!  port " + PORT);
    });
  • 相关阅读:
    《银光志Silverlight 3.0开发详解与最佳实践》出版电子版——风云编著
    Nigel Parker 40分钟视频演示了微软的 31 项技术(附下载)
    《银光志Silverlight 3.0开发详解与最佳实践》书搞目录
    Silverlight 2使用C#遍历XML(兼容Silverlight3)
    为什么要把Silverlight归入Web 2.0?
    Silverlight明年将占据互联网设备半壁江山
    Silverlight Tools 3.0中文正式版发布(附下载地址)
    银客帝国招聘Silverlight兼职开发人员
    再说招聘:学开车一定要摸方向盘
    Expression Blend 4 下载
  • 原文地址:https://www.cnblogs.com/richard1015/p/7380194.html
Copyright © 2020-2023  润新知