/// <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("数据库写入失败"); }
/// <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)); }