angular2^ typescript 将 文件和Json数据 合并发送到服务器(2.服务端)
nodejs 中使用框架
"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 = '\r\n----' + boundaryKey + '--';
var filesLength = 0, content; // 初始数据,把post过来的数据都携带上去
content = (function (obj) {
var rslt = [];
Object.keys(obj).forEach(function (key) {
var arr = ['\r\n----' + boundaryKey + '\r\n'];
arr.push('Content-Disposition: form-data; name="' + key + '"\r\n\r\n');
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 += '\r\n----' + boundaryKey + '\r\n' +
'Content-Type: application/octet-stream\r\n' +
'Content-Disposition: form-data; name="' + files[key].fieldname + '"; ' +
'filename="' + files[key].filename + '"; \r\n' +
'Content-Transfer-Encoding: binary\r\n\r\n';
files[key].contentBinary = new Buffer(content, 'utf-8');
filesLength += files[key].contentBinary.length + fs.statSync(files[key].path).size;
} else {
content = '\r\n----' + boundaryKey + '\r\n' +
'Content-Type: application/octet-stream\r\n' +
'Content-Disposition: form-data; name="' + files[key].fieldname + '"; ' +
'filename="' + files[key].filename + '"; \r\n' +
'Content-Transfer-Encoding: binary\r\n\r\n';
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 + "\n");
console.log("param>>" + param + "\n"); 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);
});
angular2^ typescript 将 文件和Json数据 合并发送到服务器(2.服务端)的更多相关文章
- angular2^ typescript 将 文件和Json数据 合并发送到服务器(1.客户端处理)
		
首先介绍下框架基本流程 (web > webservice [前端架构] ) > (nodejs [ 数据中转站 ]) >(api [后台接口]) --web (html a ...
 - MVC文件上传07-使用客户端jQuery-File-Upload插件和服务端Backload组件裁剪上传图片
		
本篇通过在配置文件中设置,对上传图片修剪后保存到指定文件夹. 相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证类型和大小 MVC文件上传02-使用HttpPostedFileB ...
 - MVC文件上传06-使用客户端jQuery-File-Upload插件和服务端Backload组件自定义控制器上传多个文件
		
当需要在控制器中处理除了文件的其他表单字段,执行控制器独有的业务逻辑......等等,这时候我们可以自定义控制器. MVC文件上传相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证 ...
 - MVC文件上传09-使用客户端jQuery-File-Upload插件和服务端Backload组件让每个用户有专属文件夹,并在其中创建分类子文件夹
		
为用户创建专属上传文件夹后,如果想在其中再创建分类子文件夹,该怎么做?可以在提交文件的视图中再添加一个隐藏域,并设置 name="uploadContext". 相关兄弟篇: MV ...
 - MVC文件上传08-使用客户端jQuery-File-Upload插件和服务端Backload组件让每个用户有专属文件夹
		
当需要为每个用户建立一个专属上传文件夹的时候,可以在提交文件的视图中添加一个隐藏域,并设置name="objectContext". 相关兄弟篇: MVC文件上传01-使用jque ...
 - MVC文件上传05-使用客户端jQuery-File-Upload插件和服务端Backload组件自定义上传文件夹
		
在零配置情况下,文件的上传文件夹是根目录下的Files文件夹,如何自定义文件的上传文件夹呢? MVC文件上传相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证类型和大小 MVC文 ...
 - MVC文件上传04-使用客户端jQuery-File-Upload插件和服务端Backload组件实现多文件异步上传
		
本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证类型和大小 ...
 - Newtonsoft.Json读取txt文件中json数据并存到SQL service 数据库!
		
using System; using System.Collections.Generic; using System.Text; using System.IO; using Newtonsoft ...
 - 使用WebClient上传文件并同时Post表单数据字段到服务端
		
之前遇到一个问题,就是使用WebClient上传文件的同时,还要Post表单数据字段,一开始以为WebClient可以直接做到,结果发现如果先 Post表单字段,就只能获取到字段及其值,如果先上传文件 ...
 
随机推荐
- 织梦CMS搭建网站必做的服务器相关安全设置
			
http://help.dedecms.com/install-use/server/2011/1109/2124.html#printSource http://www.aliweihu.com/9 ...
 - Servlet&&Jsp 概述
			
主题 Servlet的作用 构建动态网页 Servlet代码初探 Servlet与其他技术的对比 Jsp的作用 Servlet的作用 Servlet是在web服务器或应用服务器上用来动态生成html的 ...
 - 最简Java程序
			
本文是笔者创建项目--一系列java示例程序的总结.项目位置在SimplestJavaDemos,欢迎访问. 以下为正文: --- 作为一个伪完美主义+拖延癌患者,每次要学习新技术的时候,总是要把 ...
 - [SinGuLaRiTy] NOIP2017 提高组
			
[SinGuLaRiTy-1048] Copyright (c) SinGuLaRiTy 2018. All Rights Reserved. NOIP2017过了这么久,现在2018了才找到寒假这么 ...
 - HTML <form>标签
			
1.单选按钮 <html> <body> <form> 名: <input type="radio" name="myname& ...
 - 一次线上tomcat应用请求阻塞的排查经过
			
今天早上,收到一个报警,有个服务器的http往返时延飙升,同时曝出大量404,很是折腾了一番,特记录下思考和排查经过. 1.这是单纯的时延增大,还是有什么其他情况还未掌握? 因为不知道是只有时延变大而 ...
 - sql 查询 ORA-12170 TNS 连接超时特殊原因
			
一般对于ORA-12170这个问题 1 看数据ip 是否能ping通 2 数据库服务是否启动 3 数据库服务所在服务器防火墙 然而当你能进去数据,而报这个这错时: 1 看代码中数据库连接是写错 2 如 ...
 - scrapy_随机ip代理池
			
什么是ip代理? 我们电脑访问网站,其实是访问远程的服务器,通过ip地址识别是那个机器访问了服务器,服务器就知道数据该返回给哪台机器,我们生活中所用的网络是局域网,ip是运营商随机分配的,是一种直接访 ...
 - linkin大话面向对象--java关键字
			
java中的关键字有以下几个,他们不能作任何其它的用途. 发现没,java中的关键字全是小写,java是严格区分大小写的. abstract default null synchronized ...
 - HTML5 拖放(Drag 和 Drop)详解与实例
			
简介 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 先点击一个小例子:在用户开始拖动 <p> 元素时执行 JavaSc ...