diff --git "a/\346\235\250\345\270\206/2022-06-20-WebApi-\347\254\254\345\215\201\344\270\211\350\257\276.md" "b/\346\235\250\345\270\206/2022-06-20-WebApi-\347\254\254\345\215\201\344\270\211\350\257\276.md" new file mode 100644 index 0000000000000000000000000000000000000000..18384a180b5e4560cf38af98200e9853ccb2e868 --- /dev/null +++ "b/\346\235\250\345\270\206/2022-06-20-WebApi-\347\254\254\345\215\201\344\270\211\350\257\276.md" @@ -0,0 +1,75 @@ +# 2022-06-20-WebApi-第十三课 + +## 上传文件 + +获取文件信息 +```cs +public void PostUpload(IFormCollection files) +{ + foreach (var formFile in files.Files) + { + // 获取文件大小,用于判断文件是否为空和上传到数据库 + var fileSize = formFile.Length; + + // 接受到的文件名,用于上传到数据库 + var fileName = formFile.FileName.Substring(0, formFile.FileName.IndexOf(".")); + + // 接受到的文件扩展名 + var extName = formFile.FileName.Substring(formFile.FileName.IndexOf(".")); + } +} +``` + +```cs +public async Task<string> PostUpload(IFormCollection files) +{ + // 当前路径(完整路径) + var currentPath = Directory.GetCurrentDirectory(); + + // 配置路径(相对路径) + var configPath = _configuration.GetSection("UploadFileSetting").GetValue<string>("FilePath"); + + // 用于装载文件的相对路径 + var list = new List<string>(); + + var now = DateTime.Now; + // 配置路径 + 年 + 月 + 日的路径 + var preFilePath = Path.Combine(configPath, now.Year.ToString(), now.Month.ToString(), now.Day.ToString()); + + foreach (var formFile in files.Files) + { + // 获取文件大小,用于判断文件是否为空和上传到数据库 + var fileSize = formFile.Length; + + // 随机生产文件名称,保证安全 + var rndName = Guid.NewGuid().ToString("N"); + + // 接受到的文件名,用于上传到数据库 + var fileName = formFile.FileName.Substring(0, formFile.FileName.IndexOf(".")); + + // 接受到的文件扩展名 + var extName = formFile.FileName.Substring(formFile.FileName.IndexOf(".")); + + // 新的文件名(随机文件名+扩展名) + var newFileName = rndName + extName; + + // 完整的文件名称(包含当前路径、配置路径、年、月、日、新文件名) + var fullName = Path.Combine(currentPath, preFilePath, newFileName); + + // 利用文件流创建文件,写入到磁盘 + using (var stream = System.IO.File.Create(fullName)) + { + await formFile.CopyToAsync(stream); + } + + // 用于返回数据 + list.Add(Path.Combine(configPath, preFilePath, newFileName); + } + + return new { + Code = 1000, + Msg = "上传文件成功", + FilePath = list + }.JsonSerialize(); +} +``` diff --git "a/\346\235\250\345\270\206/2022-06-21-WebApi-\347\254\254\345\215\201\345\233\233\350\257\276.md" "b/\346\235\250\345\270\206/2022-06-21-WebApi-\347\254\254\345\215\201\345\233\233\350\257\276.md" new file mode 100644 index 0000000000000000000000000000000000000000..d61bba2398cfa38baec23933445d060e6c1d09f2 --- /dev/null +++ "b/\346\235\250\345\270\206/2022-06-21-WebApi-\347\254\254\345\215\201\345\233\233\350\257\276.md" @@ -0,0 +1,61 @@ +# 2022-06-21-WebApi-第十四课 + +## 添加约束 + +设置约束信息,如 类型、大小等 +在appsettings文件中 +```cs +// 属性名称由自己定义 +"UploadFileSetting": { + "Path": "UploadFiles", // 上传的文件存放文件夹的名称 + "FileType": ".jpg,.txt", // 文件类型约束 + "MaxSize": "2048" // 文件大小约束 单位字节 + } +``` + +```cs +// 从配置文件中获取允许上传的扩展名,以逗号分隔的字符串 +var permittedExtensions = _configuration.GetSection("UploadFileSetting").GetValue<string>("FileType").Split(','); + +// 从配置文件中获取允许上传的文件最大大小,单位字节 +var maxSize = _configuration.GetSection("UploadFileOption").GetValue<long>("MaxSize"); + +// 查找上传文件的扩展名是否符合约束条件,如果不符合,则全部拒绝上传 +var uploadedFileExtens = files.Files.Where(x => +{ + var ext = Path.GetExtension(x.FileName).ToLowerInvariant(); + return string.IsNullOrEmpty(ext) || !permittedExtensions.Contains(ext); +}).Count(); + +if (uploadedFileExtens > 0) +{ + return list; +} + +// 查找上传文件的文件大小是否超过约束的最大值,如果超过了,则全部拒绝上传 +var uploadeFileMaxSize = files.Files.Where(x => +{ + return x.Length > maxSize; +}).Count(); + +if (uploadeFileMaxSize > 0) +{ + return list; +} + +``` + +## 添加到数据库 +```cs +// 上传到数据库的对象 +var obj = new UploadFiles +{ + OldFileName = filename, // 原始文件名 + NewFileName = newFileName, // 新的文件名 + FileType = extName, // 文件类型 + FileSize = formFile.Length.ToString(), // 文件大小 + FilePath = configPath // 文件的(相对)路径 +}; + +_uploadFiles.Add(obj); +```