前台代码javascript
<div id="wrapper">java
<div id="container">app
<!--头部,相册选择和格式选择-->post
<div id="uploader">ui
<div class="queueList">spa
<div id="dndArea" class="placeholder">orm
<div id="filePicker"></div>server
</div>排序
</div>图片
<div class="statusBar" style="display:none;">
<div class="progress">
<span class="text">0%</span>
<span class="percentage"></span>
</div><div class="info"></div>
<div class="btns">
<div id="filePicker2"></div><div class="uploadBtn">开始上传</div>
</div>
</div>
</div>
</div>
</div>
后台代码
[HttpPost]
public ActionResult ChunkUpload()//切片
{
double n = 100.0 / 500.0;
string newFolderName = ((n + 1) * 2000).ToString();
//若是进行了分片
if (Request.Form.AllKeys.Any(m => m == "chunk"))
{
//取得chunk和chunks
int chunk = Convert.ToInt32(Request.Form["chunk"]);//当前分片在上传分片中的顺序(从0开始)
int chunks = Convert.ToInt32(Request.Form["chunks"]);//总分片数
//根据GUID建立用该GUID命名的临时文件夹
string folder = Path.Combine(HttpRuntime.AppDomainAppPath, "Media\\Default\\MediaLibrary/" + newFolderName + "/" + Request["guid"] + "/");
if (!System.IO.Directory.Exists(folder))
{
Directory.CreateDirectory(folder);
}
string path = folder + chunk;
//创建临时传输文件夹
if (!Directory.Exists(Path.GetDirectoryName(folder)))
{
Directory.CreateDirectory(folder);
}
FileStream addFile = new FileStream(path, FileMode.Append, FileAccess.Write);
BinaryWriter AddWriter = new BinaryWriter(addFile);
//得到上传的分片数据流
var file = Request.Files[0];
Stream stream = file.InputStream;
BinaryReader TempReader = new BinaryReader(stream);
//将上传的分片追加到临时文件末尾
AddWriter.Write(TempReader.ReadBytes((int)stream.Length));
//关闭BinaryReader文件阅读器
TempReader.Close();
stream.Close();
AddWriter.Close();
addFile.Close();
TempReader.Dispose();
stream.Dispose();
AddWriter.Dispose();
addFile.Dispose();
return Json(new { chunked = true, hasError = false, f_ext = Path.GetExtension(file.FileName) });
}
else//没有分片直接保存
{
Request.Files[0].SaveAs(Path.Combine(HttpRuntime.AppDomainAppPath, "Media\\Default\\MediaLibrary/" + newFolderName + "/" + DateTime.Now.ToFileTime() + Path.GetExtension(Request.Files[0].FileName)));
return Json(new { chunked = true, hasError = false });
}
}
[HttpPost]
public ActionResult Layer(FormCollection collection)//整合切片 删除切片
{
try
{
double n = 100.0 / 500.0;
string newFolderName = ((n + 1) * 2000).ToString();
if (Request.Form.AllKeys.Any(m => m == "chunk"))//判断是否切片
{
var guid = Request["guid"];//GUID
var uploadDir = Path.Combine(HttpRuntime.AppDomainAppPath, "Media\\Default\\MediaLibrary/" + newFolderName);//Upload 文件夹
if (!System.IO.Directory.Exists(uploadDir))
{
Directory.CreateDirectory(uploadDir);
}
var dir = Path.Combine(uploadDir, guid);//临时文件夹
var ext = Path.GetExtension(Request["fileName"]);//获取文件后缀名
var files = Directory.GetFiles(dir);//得到下面的全部切片文件
var name = DateTime.Now.ToFileTime().ToString() + ext;
var finalPath = Path.Combine(uploadDir, name);//最终的文件名
var fs = new FileStream(finalPath, FileMode.Create);
foreach (var part in files.OrderBy(x => x.Length).ThenBy(x => x))//排序,保证从0-N
{
var bytes = System.IO.File.ReadAllBytes(part);
fs.Write(bytes, 0, bytes.Length);
bytes = null;
System.IO.File.Delete(part);//删除分块
}
fs.Flush();
fs.Close();
Directory.Delete(dir);//删除文件夹
return Json(new { r = 1, path = "Media\\Default\\MediaLibrary/" + newFolderName + "/" + name });
}
return Json(new { r = 1, path = "Media\\Default\\MediaLibrary/" + newFolderName + "/" + DateTime.Now.ToFileTime() + Path.GetExtension(Request["fileName"]) });
}
catch (Exception ex)
{
return Json(new { r = 0, err = ex.Message });
}
}
javascript主要代码 (upload.js内)
var GUID = WebUploader.Base.guid();//一个GUID
// 实例化
uploader = WebUploader.create({
pick: {
id: '#filePicker',
label: '点击选择文件',
innerHTML: '上传',
},
formData: {
uid: 123
},
dnd: '#dndArea',
paste: '#uploader',
swf: '~/Scripts/Uploader.swf',//路径
chunked: true,//是否容许切片
chunkSize: 2*1024 * 1024,//单个切片大小
server: '/Ekm/ChunkUpload',//控制器方法
method:'POST',
// runtimeOrder: 'flash',
threads: true,
chunkRetry: 2,
// accept: {
// title: 'Images',
// extensions: 'gif,jpg,jpeg,bmp,png',
// mimeTypes: 'image/*'
// },
compress: false,
// 禁掉全局的拖拽功能。这样不会出现图片拖进页面的时候,把图片打开。
disableGlobalDnd: true,
formData: {
guid: GUID //自定义参数
},
fileNumLimit: 50, //最大文件存储数量
fileSizeLimit: 400 * 1024 * 1024, // 200 M 所有文件最大
fileSingleSizeLimit:100 * 1024 * 1024, // 50 M 单个文件最大
duplicate: false,//是否重复上传文件 true 重复 false 不重复
});
uploader.on('uploadSuccess', function (file, response) {整合切片
//合并文件
$.post('/Ekm/Layer', { guid: GUID, fileName: file.name }, function (data) {
if (data.r == 1) {
alert("上传完成");
}
else {
alert(data.err);
}
});
});
云盘地址:连接: https://pan.baidu.com/s/1nxl89fF 密码: dd9z