Nnuo 8 년 전
커밋
2cb5f2d241
6개의 변경된 파일652개의 추가작업 그리고 0개의 파일을 삭제
  1. 3 0
      .gitignore
  2. 80 0
      index.html
  3. 113 0
      index.js
  4. 367 0
      package-lock.json
  5. 16 0
      package.json
  6. 73 0
      splitUpload.js

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+/node_modules
+/upload
+/temp

+ 80 - 0
index.html

@@ -0,0 +1,80 @@
+<html>
+<head>
+	<meta charset="UTF-8">
+	<title>Document</title>
+	<script src="http://www.1473.cn/uform.js"></script>	
+</head>
+<style>
+form p span{
+	margin-left: 20px;
+}
+</style>
+<body>
+	<form action="">
+		<input type="file" id="uploadfile" >
+		<button id="uploadbtn">开始上传</button>
+		<p>文件名<span id="filename">无</span></p>
+		<p>大小<span id="filesize">0</span></p>
+		<p>进度<span id="progress">0%</span></p>
+	</form>
+</body>
+<script src="./splitUpload.js"></script>	
+<script>
+	var els = {
+		uploadfile: $("#uploadfile")[0],
+		uploadbtn: $("#uploadbtn")[0],
+		filename: $("#filename")[0],
+		filesize: $("#filesize")[0],
+		progress: $("#progress")[0]
+	}
+	// 当前上传文件的file对象
+	var currentFile = null;
+	// 暂停的标签
+	// var stopSign = true;
+	// 开始上传事件
+	uploadbtn.onclick = function(e){
+    	e.preventDefault();
+
+		if(!currentFile)
+			return;
+
+		// 开始上传
+		beginUpload(currentFile)
+	}
+	// 选择文件事件
+	uploadfile.onchange = function(){
+		var file = uploadfile.files[0], name, size;
+
+		if(!file || !file.name)
+			return;
+
+		name = file.name;
+		size = file.size;
+
+		els.filename.innerHTML = name;
+		els.filesize.innerHTML = size > 1024
+            ? size / 1024 > 1024
+	            ? size / (1024 * 1024) > 1024
+		            ? (size / (1024 * 1024 * 1024)).toFixed(2) + 'GB'
+		            : (size / (1024 * 1024)).toFixed(2) + 'MB'
+	            : (size / 1024).toFixed(2) + 'KB'
+            : (size).toFixed(2) + 'B';
+        // 设置当前文件
+		currentFile = file;
+	}
+	/**
+	 * 开始上传
+	 * @param  {File} file  上传的文件
+	 */
+	function beginUpload(file){
+		
+        splitUpload(file, function(thunkTo, totalSize) { // success
+      		progress.innerHTML = (100*thunkTo/totalSize).toFixed(2) +'%';
+      		if(thunkTo === totalSize)
+          	progress.innerHTML += '   写入成功';
+        }, function(res) { // error
+  			progress.innerHTML += '   写入失败';
+        })
+	}
+</script>	
+</html>

+ 113 - 0
index.js

@@ -0,0 +1,113 @@
+var fs = require('fs');
+var express = require('express');
+var app = express();
+var bodyParser = require('body-parser');
+var formidable = require('formidable')
+
+app.use(bodyParser.json());  
+app.use(bodyParser.urlencoded({extended: false}));  
+
+// 首页
+app.get('/', function (req, res) {
+  res.sendFile(__dirname+'/index.html');
+});
+
+app.use('/file', express.static('upload'));
+
+// js
+app.get('/splitUpload.js', function (req, res) {
+  res.sendFile(__dirname+'/splitUpload.js');
+});
+
+// 上传页
+app.post('/upload', function (req, res) {
+	
+	var form = new formidable.IncomingForm();   //创建上传表单
+  	form.uploadDir = __dirname + '/temp';
+	// 读取formdata
+	form.parse(req, function(err, fields, files) {
+		// console.log(err);
+		// console.log(fields);
+		// console.log(files);
+		// return
+		if(err){
+   			uploadError(res, err, 501);
+			return;
+		}
+		// theFile
+		// fileName
+		// totalSize
+		// isFirstChunk 是否第一次上传
+		// isLastChunk 是否最后一次上传
+		var file = files.theFile;
+		var fileName = fields.fileName;
+		var isFirstChunk = fields.isFirstChunk;
+		var isLastChunk = fields.isLastChunk;
+		// if(isTrue(isFirstChunk)){
+		// 	fileName 
+		// }
+		var fileDir = __dirname + '/upload/' + fileName;
+	    // console.log(file.path)
+		// 开启读取模式
+		fs.readFile(file.path, {flag: 'r+'}, function (err, data) {
+		    if(err) {
+		   		uploadError(res, err, 502);
+		    }else{
+				// 是否第一次读取
+				if(isTrue(isFirstChunk)){
+					// 写入文件
+					fs.writeFile(fileDir, data, {}, function (err) {
+					   	if(err) {    	
+					   		uploadError(res, err, 503);
+					    } else {
+					    	uploadSuccess(res, isLastChunk);
+					    }
+					});
+				}else{
+					// 追加写入文件
+					fs.appendFile(fileDir, data, function (err) {
+					   	if(err) {
+					   		uploadError(res, err, 505);
+					    } else {
+					    	uploadSuccess(res, isLastChunk);
+					    }
+					});
+				}
+              	fs.unlinkSync(file.path)
+		    }
+		})
+	})
+});
+// 启动服务器
+var server = app.listen(3000, function () {
+	var host = server.address().address;
+	var port = server.address().port;
+	console.log('Listening at http://%s:%s', host, port);
+});
+// 判断字符串true
+function isTrue(t){
+	return t == 'true'|| t == true;
+}
+/**
+ * 打印上传成功的log并且返回状态信息
+ * @param  {[type]}  res         [response]
+ * @param  {Boolean} isLastChunk [string | boolean]
+ */
+function uploadSuccess(res, isLastChunk) {
+   	console.log(isTrue(isLastChunk)? '写入成功': '写入完毕');
+	res.send({
+		status:200,
+		isLastChunk: isLastChunk
+	})
+}
+/**
+ * 打印错误并返回
+ * @param  {[type]} res    [response]
+ * @param  {[type]} err    [错误信息]
+ * @param  {[type]} status [错误状态]
+ */
+function uploadError(res, err, status) {
+	console.error(err);
+	console.log(status);
+	res.send({status:status})
+}

+ 367 - 0
package-lock.json

@@ -0,0 +1,367 @@
+{
+  "name": "nodejsupload",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "accepts": {
+      "version": "1.3.5",
+      "resolved": "http://registry.npm.taobao.org/accepts/download/accepts-1.3.5.tgz",
+      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+      "requires": {
+        "mime-types": "~2.1.18",
+        "negotiator": "0.6.1"
+      }
+    },
+    "array-flatten": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+    },
+    "body-parser": {
+      "version": "1.18.2",
+      "resolved": "http://registry.npm.taobao.org/body-parser/download/body-parser-1.18.2.tgz",
+      "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+      "requires": {
+        "bytes": "3.0.0",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "~1.1.1",
+        "http-errors": "~1.6.2",
+        "iconv-lite": "0.4.19",
+        "on-finished": "~2.3.0",
+        "qs": "6.5.1",
+        "raw-body": "2.3.2",
+        "type-is": "~1.6.15"
+      }
+    },
+    "bytes": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
+    },
+    "content-disposition": {
+      "version": "0.5.2",
+      "resolved": "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.2.tgz",
+      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz",
+      "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js="
+    },
+    "cookie": {
+      "version": "0.3.1",
+      "resolved": "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz",
+      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "http://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz",
+      "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "http://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+    },
+    "express": {
+      "version": "4.16.2",
+      "resolved": "http://registry.npm.taobao.org/express/download/express-4.16.2.tgz",
+      "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=",
+      "requires": {
+        "accepts": "~1.3.4",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.18.2",
+        "content-disposition": "0.5.2",
+        "content-type": "~1.0.4",
+        "cookie": "0.3.1",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "~1.1.1",
+        "encodeurl": "~1.0.1",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "1.1.0",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.2",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.2",
+        "qs": "6.5.1",
+        "range-parser": "~1.2.0",
+        "safe-buffer": "5.1.1",
+        "send": "0.16.1",
+        "serve-static": "1.13.1",
+        "setprototypeof": "1.1.0",
+        "statuses": "~1.3.1",
+        "type-is": "~1.6.15",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.0.tgz",
+      "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.1",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.2",
+        "statuses": "~1.3.1",
+        "unpipe": "~1.0.0"
+      }
+    },
+    "formidable": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/formidable/download/formidable-1.2.0.tgz",
+      "integrity": "sha1-zikb/sZ8F24oL4keziw33gyDroQ="
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "http://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+    },
+    "http-errors": {
+      "version": "1.6.2",
+      "resolved": "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.2.tgz",
+      "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+      "requires": {
+        "depd": "1.1.1",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.0.3",
+        "statuses": ">= 1.3.1 < 2"
+      },
+      "dependencies": {
+        "depd": {
+          "version": "1.1.1",
+          "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.1.tgz",
+          "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
+        },
+        "setprototypeof": {
+          "version": "1.0.3",
+          "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.0.3.tgz",
+          "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
+        }
+      }
+    },
+    "iconv-lite": {
+      "version": "0.4.19",
+      "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.19.tgz",
+      "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs="
+    },
+    "inherits": {
+      "version": "2.0.3",
+      "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+    },
+    "ipaddr.js": {
+      "version": "1.6.0",
+      "resolved": "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.6.0.tgz",
+      "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs="
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+    },
+    "merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+    },
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+    },
+    "mime": {
+      "version": "1.4.1",
+      "resolved": "http://registry.npm.taobao.org/mime/download/mime-1.4.1.tgz",
+      "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY="
+    },
+    "mime-db": {
+      "version": "1.33.0",
+      "resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.33.0.tgz",
+      "integrity": "sha1-o0kgUKXLm2NFBUHjnZeI0icng9s="
+    },
+    "mime-types": {
+      "version": "2.1.18",
+      "resolved": "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.18.tgz",
+      "integrity": "sha1-bzI/YKg9ERRvgx/xH9ZuL+VQO7g=",
+      "requires": {
+        "mime-db": "~1.33.0"
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+    },
+    "negotiator": {
+      "version": "0.6.1",
+      "resolved": "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz",
+      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "parseurl": {
+      "version": "1.3.2",
+      "resolved": "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz",
+      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+    },
+    "proxy-addr": {
+      "version": "2.0.3",
+      "resolved": "http://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.3.tgz",
+      "integrity": "sha1-NV8mJQWmIWRrMTCnKOtkfiIFU0E=",
+      "requires": {
+        "forwarded": "~0.1.2",
+        "ipaddr.js": "1.6.0"
+      }
+    },
+    "qs": {
+      "version": "6.5.1",
+      "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.1.tgz",
+      "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg="
+    },
+    "range-parser": {
+      "version": "1.2.0",
+      "resolved": "http://registry.npm.taobao.org/range-parser/download/range-parser-1.2.0.tgz",
+      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
+    },
+    "raw-body": {
+      "version": "2.3.2",
+      "resolved": "http://registry.npm.taobao.org/raw-body/download/raw-body-2.3.2.tgz",
+      "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+      "requires": {
+        "bytes": "3.0.0",
+        "http-errors": "1.6.2",
+        "iconv-lite": "0.4.19",
+        "unpipe": "1.0.0"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.1",
+      "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz",
+      "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM="
+    },
+    "send": {
+      "version": "0.16.1",
+      "resolved": "http://registry.npm.taobao.org/send/download/send-0.16.1.tgz",
+      "integrity": "sha1-pw4coh0TgsEdDZ9iMd6ygQgNerM=",
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "~1.1.1",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.1",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "~1.6.2",
+        "mime": "1.4.1",
+        "ms": "2.0.0",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.0",
+        "statuses": "~1.3.1"
+      }
+    },
+    "serve-static": {
+      "version": "1.13.1",
+      "resolved": "http://registry.npm.taobao.org/serve-static/download/serve-static-1.13.1.tgz",
+      "integrity": "sha1-TFfVNASnYdjy58HooYpH2/J4pxk=",
+      "requires": {
+        "encodeurl": "~1.0.1",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.2",
+        "send": "0.16.1"
+      }
+    },
+    "setprototypeof": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz",
+      "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY="
+    },
+    "statuses": {
+      "version": "1.3.1",
+      "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz",
+      "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
+    },
+    "type-is": {
+      "version": "1.6.16",
+      "resolved": "http://registry.npm.taobao.org/type-is/download/type-is-1.6.16.tgz",
+      "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=",
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.18"
+      }
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+    }
+  }
+}

+ 16 - 0
package.json

@@ -0,0 +1,16 @@
+{
+  "name": "nodejsupload",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "body-parser": "^1.18.2",
+    "express": "^4.16.2",
+    "formidable": "^1.2.0"
+  }
+}

+ 73 - 0
splitUpload.js

@@ -0,0 +1,73 @@
+var splitUpload =  (function(){
+	/**
+	 * 分割上传其中一块
+     * @param  {[type]} file        [文件Flie对象]
+	 * @param  {[type]} totalSize   [总大小]
+	 * @param  {[type]} eachSize    [每次大小]
+     * @param  {[type]} SucCallback [成功回调]
+     *         回调参数
+     *         		@param thunkTo [已上传大小]       
+     *         		@param totalSize [总大小]        
+     * @param  {[type]} ErrCallback [失败回调]
+     *         回调参数
+     *         		@param res [ajax回调的response]       
+	 * @param  {[type]} count       [上传的次数] 
+	 * @param  {[type]} counts       [上传的总次数]
+     * @param  {[string]} uploadLink  [上传链接]  默认
+	 */
+    function loop(file, totalSize, eachSize, SucCallback, ErrCallback, count, counts, uploadLink){
+    	var thunkFrom = count *	eachSize;// 切割起始端
+    	var thunkTo = (count + 1) * eachSize > totalSize ? totalSize : (count + 1) * eachSize;// 切割末端
+
+		fd = new FormData();
+		fd.append('theFile', file.slice(thunkFrom, thunkTo)); // 分好段的文件
+		fd.append('fileName', file.name); // 文件名
+		fd.append('totalSize', totalSize); // 大小
+		fd.append('isFirstChunk', count === 0); // 是否第一次上传
+		fd.append('isLastChunk', count === counts - 1); // 是否最后一次上传
+
+		var xhr = new XMLHttpRequest();
+
+		xhr.open("post", uploadLink, true);
+
+		xhr.onreadystatechange = function () {
+          	if(xhr.readyState==4 && xhr.status==200){
+	          	var rs = JSON.parse(xhr.responseText);
+	          	if(rs.status == 200){
+	          		SucCallback(thunkTo, totalSize)
+	          		// isLastChunk
+	          		if(count === counts - 1){
+	          			return;
+	          		}
+	          		// 继续上传
+					loop(file, totalSize, eachSize, SucCallback, ErrCallback, ++count, counts, uploadLink)
+	          	}else{
+          			ErrCallback(rs)
+	          	}
+			}
+		};
+		xhr.send(fd);
+    }
+    /**
+     * 分割上传
+     * @param  {[type]} file        [文件Flie对象]
+     * @param  {[function]} SucCallback [成功回调]
+     * @param  {[function]} ErrCallback [失败回调]
+     * @param  {[string]} uploadLink  [上传链接] default 
+     */
+	return function(file, SucCallback, ErrCallback, uploadLink) {
+		uploadLink = uploadLink || '/upload';
+        var totalSize = file.size; // 总大小
+        var eachSize = 1024 * 1000; // 每次上传大小  这里是100kb
+        var counts = Math.ceil(totalSize / eachSize); // 上传的总次数
+
+		loop(file, totalSize, eachSize, SucCallback, ErrCallback, 0, counts, uploadLink)
+	//test
+	/*size > 1024
+            ? size / 1024 > 1024
+	            ? size / (1024 * 1024) > 1024
+		            ? (size / (1024 * 1024 * 1024)).toFixed(2) + 'GB'
+		            : (size / (1024 * 1024)).toFixed(2) + 'MB'
+	            : (size / 1024).toFixed(2) + 'KB'
+            : (size).toFixed(2) + 'B';*/
+})();