asp.net mvc 上传文件

转至:http://www.cnblogs.com/fonour/p/ajaxFileUpload.html

0、下载 https://files.cnblogs.com/files/fonour/ajaxfileupload.js

1、引用ajaxfileupload.js

<script src="../../Content/js/jquery-2.1.4.min.js"></script>
<script src="../../Content/js/ajaxfileupload.js"></script>

2、页面添加类型为file的input标签

<input type="file"  name="filePicture" accept=".jpg,.jpeg,.png,.bmp" onchange="filePictureChange()" />

3、添加了onchange事件,在选择文件后立即上传文件,onchange时间定义如下

var filePictureChange = function(){
  $.ajaxFileUpload({
          type: "post",                          //请求类型:post或get,当要使用data提交自定义参数时一定要设置为post
          url: "/Shared/Upload",                 //文件上传的服务器端请求地址
            secureuri: false,                      //是否启用安全提交,一般默认为false就行,不用特殊处理
            fileElementId: "filePicture",          //文件上传控件的id   <input type="file"  />
          dataType: "json",                      //返回值类型,一般设置为json,还支持html\xml\script类型
            data: { "id": "1", "name": "test" },   //用于post请求提交自定义参数
            success: function (data, status) {     //服务器成功响应处理函数
            },
            error: function (data, status, e) {    //服务器响应失败处理函数
            }
        });

}

4、后台控制器方法

        /// <summary>
        /// 附件上传
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ActionResult AjaxUpload()
        {
            HttpFileCollection files = System.Web.HttpContext.Current.Request.Files;
            if (files.Count == 0) return Json("Faild", JsonRequestBehavior.AllowGet);
            MD5 md5Hasher = new MD5CryptoServiceProvider();
            /*计算指定Stream对象的哈希值*/
            byte[] arrbytHashValue = md5Hasher.ComputeHash(files[0].InputStream);
            /*由以连字符分隔的十六进制对构成的String,其中每一对表示value中对应的元素;例如“F-2C-4A”*/
            string strHashData = System.BitConverter.ToString(arrbytHashValue).Replace("-", "");
            string FileEextension = Path.GetExtension(files[0].FileName);
            string uploadDate = DateTime.Now.ToString("yyyyMMdd");
            string virtualPath = string.Format("/upload/{0}/{1}{2}", uploadDate, strHashData, FileEextension);
            string fullFileName = Server.MapPath(virtualPath);
            //创建文件夹,保存文件
            string path = Path.GetDirectoryName(fullFileName);
            Directory.CreateDirectory(path);
            if (!System.IO.File.Exists(fullFileName))
            {
                files[0].SaveAs(fullFileName);
            }
            string fileName = files[0].FileName.Substring(files[0].FileName.LastIndexOf("\\") + 1, files[0].FileName.Length - files[0].FileName.LastIndexOf("\\") - 1);
            string fileSize = GetFileSize(files[0].ContentLength);
            return Json(new { FileName = fileName, FilePath = virtualPath, FileSize = fileSize }, "text/html", JsonRequestBehavior.AllowGet);
        }
        /// <summary>
        /// 获取文件大小
        /// </summary>
        /// <param name="bytes"></param>
        /// <returns></returns>
        private string GetFileSize(long bytes)
        {
            long kblength = 1024;
            long mbLength = 1024 * 1024;
            if (bytes < kblength)
                return bytes.ToString() + "B";
            if (bytes < mbLength)
                return decimal.Round(decimal.Divide(bytes, kblength), 2).ToString() + "KB";
            else
                return decimal.Round(decimal.Divide(bytes, mbLength), 2).ToString() + "MB";
        }