/// <summary>
        /// 保存上传文件临时文件夹
        /// </summary>
        /// <param name="file">上传文件</param>
        /// <param name="cfg">上传配置信息</param>
        /// <returns>新保存文件路径信息</returns>
        public static string SaveAsTemporary(HttpPostedFileBase file, UploadConfig cfg)
        {
            string ext      = Path.GetExtension(file.FileName);
            string fileName = CreatTemporaryFileName(ext, cfg);

            return(Save(file, fileName, cfg));
        }
        /// <summary>
        /// 保存文件流
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="fileName"></param>
        /// <param name="ext"></param>
        /// <param name="cfg"></param>
        /// <returns></returns>
        public static string Save(Stream stream, string fileName, string ext, UploadConfig cfg)
        {
            Uri uri = null;

            if (string.IsNullOrWhiteSpace(fileName) || Uri.TryCreate(fileName, UriKind.Absolute, out uri))
            {
                fileName = CreateFileName(ext, cfg);
            }
            else
            {
                fileName = CreateFileName(ext, cfg, fileName);
            }
            string diskFileName = GetUploadFileDiskPath(fileName, cfg);
            string dir          = Path.GetDirectoryName(diskFileName);

            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }
            var bytes = ReadBytes(stream);

            stream.Close();
            stream.Dispose();

            File.WriteAllBytes(diskFileName, bytes);
            return(fileName);
        }
        /// <summary>
        /// 保存上传文件
        /// </summary>
        /// <param name="file">上传文件</param>
        /// <param name="cfg">上传配置信息</param>
        /// <param name="customerFileName">自定义文件名</param>
        /// <returns>新保存文件路径信息</returns>
        public static string SaveAs(HttpPostedFileBase file, UploadConfig cfg, string customerFileName = null)
        {
            string ext      = Path.GetExtension(file.FileName);
            string fileName = !string.IsNullOrWhiteSpace(customerFileName) ? customerFileName : file.FileName;

            return(Save(file, fileName, cfg));
        }
        /// <summary>
        /// 上传文件检查
        /// </summary>
        /// <param name="file">文件信息</param>
        /// <param name="cfg">上传配置信息</param>
        public static void Check(HttpPostedFileBase file, UploadConfig cfg)
        {
            if (file == null || file.ContentLength <= 0)
            {
                throw new Exception("上传文件不能为空!");
            }

            //获取当前请求HttpContext
            var context = ApplicationObject.CurrentOneHttpContext;

            //获取上传文件扩展名
            var ext = System.IO.Path.GetExtension(file.FileName);

            ext = string.IsNullOrWhiteSpace(ext) ? string.Empty : ext.Trim().ToUpper();

            //检查此扩展名文件是否允许上传
            if (!cfg.AllowType.Contains(ext))
            {
                throw new Exception(string.Format("不支持{0}文件类型上传", ext));
            }


            //检查文件大小是否超过限制
            if ((file.ContentLength / 1024) > cfg.MaxFileSize)
            {
                throw new Exception(string.Format("上传文件必须小于{0}", TypeUtil.FileSize(cfg.MaxFileSize * 1024)));
            }
        }
        private static string GetUploadFileDiskPath(string url, UploadConfig cfg)
        {
            if (string.IsNullOrWhiteSpace(url))
            {
                return(string.Empty);
            }

            Uri uri = new Uri(url, UriKind.RelativeOrAbsolute);

            if (uri.IsAbsoluteUri)
            {
                url = uri.AbsolutePath.Substring(1);
            }

            var p        = System.Web.VirtualPathUtility.IsAppRelative(url) ? System.Web.VirtualPathUtility.ToAbsolute(url) : url;
            var fullPath = string.Empty;

            if (System.IO.Path.IsPathRooted(p))
            {
                fullPath = httpContext.Server.MapPath(p);
            }
            else
            {
                string basePath = string.IsNullOrWhiteSpace(cfg.BasePath) ? ApplicationObject.CurrentOneHttpContext.Server.MapPath("~/") : cfg.BasePath;
                fullPath = System.IO.Path.Combine(basePath, url);
            }
            return(fullPath);
        }
        /// <summary>
        /// 创建一个指定类型带路径的临时文件名
        /// </summary>
        /// <param name="ext">文件类型</param>
        /// <returns></returns>
        private static string CreatTemporaryFileName(string ext, UploadConfig cfg)
        {
            string folder = WebHelper.MapPath(cfg.Folder) + Path.DirectorySeparatorChar.ToString();
            string name   = Guid.NewGuid().ToString("N");

            return(string.Concat(folder, name, ext));
        }
        /// <summary>
        /// 创建一个指定类型带路径的临时文件名
        /// </summary>
        /// <param name="ext">文件类型</param>
        /// <returns></returns>
        private static string CreatTemporaryFileName(string ext, UploadConfig cfg)
        {
            string folder = System.Web.Mvc.UrlHelper.GenerateContentUrl(cfg.TempPath, new HttpContextWrapper(ApplicationObject.CurrentOneHttpContext));

            folder = System.Web.VirtualPathUtility.AppendTrailingSlash(folder);
            string name = Guid.NewGuid().ToString("N");

            return(string.Concat(folder, name, ext));
        }
        /// <summary>
        /// 保存上传文件
        /// </summary>
        /// <param name="file">上传文件</param>
        /// <param name="fileName">保存文件名</param>
        /// <param name="cfg">上传配置信息</param>
        /// <returns>返回地址</returns>
        public static string Save(HttpPostedFileBase file, string fileName, UploadConfig cfg)
        {
            Check(file, cfg);

            //获取上传文件扩展名
            var ext = System.IO.Path.GetExtension(file.FileName);

            ext = string.IsNullOrWhiteSpace(ext) ? string.Empty : ext.Trim().ToUpper();

            return(Save(file.InputStream, fileName, ext, cfg));
        }
        /// <summary>
        /// 创建一个指定类型带路径的文件名
        /// </summary>
        /// <param name="ext">文件类型</param>
        /// <param name="cfg">上传配置</param>
        /// <param name="customerFileName">自定义文件名</param>
        /// <returns></returns>
        private static string CreateFileName(string ext, UploadConfig cfg, string customerFileName = null)
        {
            string folder = System.Web.Mvc.UrlHelper.GenerateContentUrl(cfg.Folder, new HttpContextWrapper(ApplicationObject.CurrentOneHttpContext));

            folder = System.Web.VirtualPathUtility.AppendTrailingSlash(folder);
            folder = string.Concat(folder, DateTime.Now.ToString("yyyyMM", DateTimeFormatInfo.InvariantInfo));
            folder = System.Web.VirtualPathUtility.AppendTrailingSlash(folder);
            string name     = customerFileName.ObjToStr().Length > 0 ? customerFileName.ObjToStr() : Guid.NewGuid().ToString("N");
            var    fileName = name.Contains(ext) ? string.Concat(folder, name, ext) : string.Concat(folder, name);

            return(File.Exists(fileName) ? CreateFileName(ext, cfg) : fileName);
        }
        /// <summary>
        /// 创建一个指定类型带路径的文件名
        /// </summary>
        /// <param name="ext">文件类型</param>
        /// <param name="cfg">上传配置</param>
        /// <param name="customerFileName">自定义文件名</param>
        /// <returns></returns>
        private static string CreateFileName(string ext, UploadConfig cfg, string customerFileName = null)
        {
            string folder = WebHelper.MapPath(cfg.Folder) + Path.DirectorySeparatorChar.ToString();

            folder = string.Concat(folder, DateTime.Now.ToString("yyyyMM", DateTimeFormatInfo.InvariantInfo)) + Path.DirectorySeparatorChar.ToString();
            string name     = customerFileName.ObjToStr().Length > 0 ? customerFileName.ObjToStr() : Guid.NewGuid().ToString("N");
            var    fileName = name.ToUpper().Contains(ext) ? string.Concat(folder, name) : string.Concat(folder, name, ext);

            if (File.Exists(fileName))
            {
                return(CreateFileName(ext, cfg));
            }
            return(fileName.Replace(Globals.GetWebDir(), string.Empty).Replace(Path.DirectorySeparatorChar.ToString(), "/"));
        }
        private static string GetUploadFileDiskPath(string url, UploadConfig cfg)
        {
            if (string.IsNullOrWhiteSpace(url))
            {
                return(string.Empty);
            }

            Uri uri = new Uri(url, UriKind.RelativeOrAbsolute);

            if (uri.IsAbsoluteUri)
            {
                url = uri.AbsolutePath.Substring(1);
            }
            return(WebHelper.MapPath(url));
        }
        /// <summary>
        /// 从XML载入上传配置
        /// </summary>
        /// <param name="cfg"></param>
        /// <param name="el"></param>
        private static void GetConfigByXmlNote(UploadConfig cfg, XElement el)
        {
            var allowType = el.Element("allowType");

            if (allowType != null && !string.IsNullOrWhiteSpace(allowType.Value))
            {
                var exts = allowType.Value.Split(new[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries);

                cfg.AllowType = exts.Select(o => System.IO.Path.GetExtension(o).ToUpper()).ToList();
            }

            var maxFileSize = el.Element("maxFileSize");

            if (maxFileSize != null && !string.IsNullOrWhiteSpace(maxFileSize.Value))
            {
                cfg.MaxFileSize = maxFileSize.Value.ObjToInt();
            }

            var tempPath = el.Element("tempPath");

            if (tempPath != null && !string.IsNullOrWhiteSpace(tempPath.Value))
            {
                cfg.TempPath = tempPath.Value;
            }

            var queueSizeLimit = el.Element("queueSizeLimit");

            if (queueSizeLimit != null && !string.IsNullOrWhiteSpace(queueSizeLimit.Value))
            {
                cfg.QueueSizeLimit = queueSizeLimit.Value.ObjToInt();
            }

            var folder = el.Element("folder");

            if (folder != null && !string.IsNullOrWhiteSpace(folder.Value))
            {
                cfg.Folder = folder.Value;
            }

            var basePath = el.Element("basePath");

            if (basePath != null && !string.IsNullOrWhiteSpace(basePath.Value))
            {
                cfg.BasePath = basePath.Value;
            }
        }
        /// <summary>
        /// 获取上传参数
        /// </summary>
        /// <returns>上传参数</returns>
        public static UploadConfig GetUploadConfig(string configPath, string configName)
        {
            string       path = httpContext.Server.MapPath(configPath);
            var          doc  = XDocument.Load(path);
            UploadConfig cfg  = new UploadConfig();

            if (doc != null)
            {
                var def = doc.Element("root").Element("default");
                GetConfigByXmlNote(cfg, def);

                var config = doc.Element("root").Element(configName);
                if (config != null)
                {
                    GetConfigByXmlNote(cfg, config);
                }
            }
            return(cfg);
        }
        /// <summary>
        /// 获取上传参数
        /// </summary>
        /// <returns>上传参数</returns>
        public static UploadConfig GetUploadConfig(string configName)
        {
            string       configPath = "~/Config/upload.xml";
            string       path       = WebHelper.MapPath(configPath);
            var          doc        = XDocument.Load(path);
            UploadConfig cfg        = new UploadConfig();

            if (doc != null)
            {
                var def = doc.Element("root").Element("default");
                GetConfigByXmlNote(cfg, def);
                if (!string.IsNullOrWhiteSpace(configName))
                {
                    var config = doc.Element("root").Element(configName);
                    if (config != null)
                    {
                        GetConfigByXmlNote(cfg, config);
                    }
                }
            }
            return(cfg);
        }