MVC_WebUploader上传大文件

前台代码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

相关文章
相关标签/搜索