上传文件与socket.io

var http = require('http');
var fs = require('fs')
var formidable = require('formidable');
var util = require('util');
var io = require('socket.io');
var progress = {finish: false};

var server = http.createServer(function(req, res) {
	switch (req.method) {
		case 'GET':
			show(req, res);
			break;
		case 'POST':
			upload(req, res);
			break;
	}
});

function socketListen() {
	io.listen(server).sockets.on('connection', function(sock) {
		console.log('connection');
		setInterval(function(){
//			sock.emit("progress", 'percent2');
			if (progress.finish == false && progress.percent != undefined) {
			//	sock.emit("progress", 'percent1');
				console.log(progress.percent);
				sock.emit("progress", progress.percent);
				if (progress.percent == 100) {
					progress.finish = false;
				}
			}
		}, 500);

		sock.on('disconnect', function() {
			console.log("exit");
		});
	});
}

function show(req, res) {
	var html = ''
		+ '<form method="post" action="/" enctype="multipart/form-data">'
		+ '<p><input type="text" name="name"/></p>'
		+ '<p><input type="file" name="file"/></p>'
		+ '<p><input type="submit" value="Upload"/></p>'
		+ '</form>';
	res.setHeader('Content-Type', 'text/html');
	res.setHeader('Content-Length', Buffer.byteLength(html));
	res.end(html);
}

function upload(req, res) {
	if (!isFormData(req)) {
		res.statusCode = 400;
		res.end('Bad Request: expecting multipart/form-data');
		return;
	}

	var html = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body>'
	+ '<p>上传文件中: </p>'
	+ '<div id="p1"></div>'
	+ '<script src="/socket.io/socket.io.js" type="text/javascript"></script>'
	+ '<script>'
	+ 'var socket = io.connect("http://127.0.0.1:3000");'
	+ 'socket.on("progress", function(data) {document.getElementById("p1").innerHTML=data;});'
	+ '</script>'
	+ '</body></html>';
	res.write(html);

	var form = new formidable.IncomingForm();
	form.uploadDir = '.';
	form.parse(req, function(err, fields, files) {
		fs.renameSync(files.file.path, files.file.name + '.backup');
		res.end('upload complete!');
	});

	form.on('progress', function(bytesReceived, bytesExpected) {
		var percent = Math.floor(bytesReceived / bytesExpected * 100);
		progress.percent = percent;
		progress.finish = false;
	});
}

function isFormData(req) {
	var type= req.headers['content-type'];
	return 0 == type.indexOf('multipart/form-data');
}

server.listen(3000);
socketListen();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值