<html> <head> <meta name="viewport" content="width=device-width" /> <title></title> <script src="~/Scripts/jquery-1.11.1.min.js"></script> <script src="~/Scripts/vue.min.js"></script> <script> //记录文件上传状态,如果文件上传完成则为false 否则为true var upType = false; function upload() { var file = $("#file")[0].files[0], //文件对象 name = file.name, //文件名 size = file.size, //总大小 succeed = 0; name = guid() +"."+name.replace(/.+\./, "") var shardSize = 2 * 1024 * 1024, //以2MB为一个分片 shardCount = Math.ceil(size / shardSize); //总片数 for (var i = 0; i < shardCount; ++i) { //计算每一片的起始与结束位置 var start = i * shardSize, end = Math.min(size, start + shardSize); //构造一个表单,FormData是HTML5新增的 var form = new FormData(); form.append("data", file.slice(start, end)); //slice方法用于切出文件的一部分 form.append("name", name);//文件名称 form.append("total", shardCount); //总片数 form.append("index", i + 1); //当前是第几片 var pro = document.getElementById("pro"); pro.max = shardCount; console.log("index", i); //Ajax提交 $.ajax({ url: "/WebApplication1/Home/GoToUpload/", type: "POST", data: form, async: true, //异步 processData: false, contentType: false, success: function () { ++succeed; var pro = document.getElementById("pro"); pro.value = succeed; var num = (succeed / shardCount) * 100; //展示上传的百分比 $("#output").text(num.toFixed(2) + "%"); $("#div").html(num.toFixed(2) + "%"); if (succeed == shardCount) { } } }); } } //生成随机 GUID 数 function guid() { function S4() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); } return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4()); } </script> </head> <body> <div id="app"> <input type="file" id="file" /> <div id="div"></div> <progress id="pro" value="0"></progress> <span id="output" style="font-size: 15px">等待</span><br> <button type="button" onclick="upload()" class="btn btn-primary">上传资源</button><br /> <input type="hidden" id="path" /> </div> </body> </html>
public JsonResult GoToUpload() { //从Request中取参数,注意上传的文件在Requst.Files中 string name = Request["name"]; int total = Convert.ToInt32(Request["total"]); int index = Convert.ToInt32(Request["index"]); var data = Request.Files["data"]; string dirTemplete = Server.MapPath("~/Upload/Template/"); string file = Path.Combine(dirTemplete, name + "_" + index); data.SaveAs(file); int files = GetFilesNum(dirTemplete, name); if (files == total) { try { string dir = Server.MapPath("~/Upload/File/"); string newFile = Path.Combine(dir, name); using (var fs = new FileStream(newFile, FileMode.Create)) { for (int i = 1; i <= total; ++i) { string part = Path.Combine(dirTemplete, name + "_" + i); var bytes = System.IO.File.ReadAllBytes(part); fs.Write(bytes, 0, bytes.Length); bytes = null; System.IO.File.Delete(part); } } } catch (Exception ex) { string a = ex.Message; } } //返回是否成功,此处做了简化处理 return Json(new { Error = 0 }); } public int GetFilesNum(string path, string fileName) { DirectoryInfo root = new DirectoryInfo(path); FileInfo[] files = root.GetFiles(); List<string> listFile = new List<string>(); foreach (var item in files) { if (item.Name.Split('.')[0].ToLower() == fileName.Split('.')[0].ToLower()) { listFile.Add(item.Name); } } return listFile.Count(); }