示例#1
0
        /// <summary>
        /// 上传附件
        /// </summary>
        /// <param name="request">HttpRequest</param>
        /// <param name="type">上传附件类型</param>
        /// <param name="settings">指定的上传设置</param>
        /// <param name="inputName">获取指定Input控件的文件</param>
        /// <returns>
        /// 上传结果信息
        /// </returns>
        /// <exception cref="System.ArgumentNullException">
        /// request;请求失效
        /// or
        /// request;指定的用户不存在
        /// </exception>
        /// <exception cref="System.Data.DataException">数据库写入失败</exception>
        public UploadResult DoUpload(HttpRequestBase request, string type,
                                     UploadSettings settings = null, string inputName = null)
        {
            var result = new UploadResult {
                Errors = new List <UploadError>()
            };

            if (!string.IsNullOrEmpty(inputName) && !request.Files.AllKeys.Contains(inputName))
            {
                result.Errors.Add(new UploadError
                {
                    ErrorType = UploadErrorType.指定的文件不存在,
                    InputName = inputName
                });
                return(result);
            }

            if (request == null)
            {
                throw new ArgumentNullException(nameof(request), "请求失效");
            }

            result.Uploads = new List <UploadFile>();

            //如果没有指定设置文件,则获取默认的设置项
            if (settings == null)
            {
                settings = GetSettings();
            }

            for (var i = 0; i < request.Files.Count; i++)
            {
                var upload = request.Files.AllKeys[i];
                //如果指定了Input名称,则寻找对应的Input执行上传操作
                if (Equals(upload, inputName))
                {
                    continue;
                }

                var file = request.Files[i];
                if (file == null)
                {
                    continue;
                }
                if (file.ContentLength <= 0)
                {
                    continue;
                }

                //最大文件长度控制
                if (settings.MaxLength > 0 && file.ContentLength > settings.MaxLength)
                {
                    result.Errors.Add(new UploadError
                    {
                        ErrorType = UploadErrorType.文件过大,
                        FileId    = i,
                        FileName  = file.FileName,
                        InputName = upload
                    });
                    continue;
                }

                //按文件扩展名过滤
                if (settings.AllowExts != "*")
                {
                    var fileExtName = Path.GetExtension(file.FileName);

                    //找不到文件的时候
                    if (fileExtName == null)
                    {
                        result.Errors.Add(new UploadError
                        {
                            ErrorType = UploadErrorType.指定的文件不存在,
                            FileId    = i,
                            FileName  = file.FileName,
                            InputName = upload
                        });
                        continue;
                    }

                    //允许的扩展名列表
                    var allowExts = settings.AllowExts.Split(',');
                    if (!allowExts.Contains(fileExtName))
                    {
                        result.Errors.Add(new UploadError
                        {
                            ErrorType = UploadErrorType.扩展名未在允许列表,
                            FileId    = i,
                            FileName  = file.FileName,
                            InputName = upload
                        });
                        continue;
                    }
                }

                //文件上传路径
                var path = ConfigurationManager.AppSettings["UploadPath"] ?? AppDomain.CurrentDomain.BaseDirectory + "uploads/";

                path = Path.Combine(path, DateTime.Now.ToString("yyyyMM"));

                //如果没找到路径就自己建个
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }

                var filename     = Path.GetFileName(file.FileName);
                var mimeType     = file.ContentType;
                var fileTruename = filename;

                //用guid作为其储存文件名
                filename = Guid.NewGuid().ToString();
                try
                {
                    file.SaveAs(Path.Combine(path, filename));
                }
                catch (IOException)//文件IO错误,绝大部分是因为空间不足,另一部分是因为服务器权限。
                {
                    result.Errors.Add(new UploadError
                    {
                        ErrorType = UploadErrorType.务器磁盘空间不足,
                        FileId    = i,
                        FileName  = file.FileName,
                        InputName = upload
                    });
                    continue;
                }
                catch (Exception)
                {
                    result.Errors.Add(new UploadError
                    {
                        ErrorType = UploadErrorType.未知错误,
                        FileId    = i,
                        FileName  = file.FileName,
                        InputName = upload
                    });
                    continue;
                }

                var u = new UploadFile
                {
                    CreatedAt = DateTime.Now,
                    CreatedBy = AccountNo,
                    Mime      = mimeType,
                    Name      = fileTruename,
                    ResType   = type,
                    No        = filename,
                    Path      = Path.Combine(path, filename),
                    Size      = file.ContentLength
                };
                result.Uploads.Add(u);
            }

            //如果没有成功成功上传的文件或成功写入数据库,则正常返回
            if (!result.Uploads.Any() || result.Uploads.All(m => !Create(m).HasError))
            {
                return(result);
            }

            //数据库写入失败执行还原操作
            foreach (var upload in result.Uploads)
            {
                File.Delete(upload.Path);
            }
            result.Uploads.Clear();
            result.Uploads = null;
            result.Errors.Clear();
            throw new DataException("数据库写入失败");
        }
示例#2
0
 /// <summary>
 /// 上传附件
 /// </summary>
 /// <typeparam name="TResourceType">资源类型</typeparam>
 /// <param name="request">HttpRequest</param>
 /// <param name="settings">指定的上传设置</param>
 /// <param name="inputName">获取指定Input控件的文件</param>
 /// <returns>上传结果信息</returns>
 public UploadResult DoUpload <TResourceType>(HttpRequestBase request,
                                              UploadSettings settings = null, string inputName = null)
 {
     return(DoUpload(request, typeof(TResourceType).Name, settings, inputName));
 }