UploadHelper.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using ZhonTai.Common.Attributes;
  2. using ZhonTai.Common.Configs;
  3. using ZhonTai.Common.Domain.Dto;
  4. using Microsoft.AspNetCore.Http;
  5. using System;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. using FileInfo = ZhonTai.Common.Files.FileInfo;
  11. using Yitter.IdGenerator;
  12. namespace ZhonTai.Common.Helpers
  13. {
  14. /// <summary>
  15. /// 文件上传帮助类
  16. /// </summary>
  17. [SingleInstance]
  18. public class UploadHelper
  19. {
  20. /// <summary>
  21. /// 上传单文件
  22. /// </summary>
  23. /// <param name="file"></param>
  24. /// <param name="config"></param>
  25. /// <param name="args"></param>
  26. /// <param name="cancellationToken"></param>
  27. /// <returns></returns>
  28. public async Task<IResponseOutput<FileInfo>> UploadAsync(IFormFile file, FileUploadConfig config, object args, CancellationToken cancellationToken = default)
  29. {
  30. var res = new ResponseOutput<FileInfo>();
  31. if (file == null || file.Length < 1)
  32. {
  33. return res.NotOk("请上传文件!");
  34. }
  35. //格式限制
  36. if (!config.ContentType.Contains(file.ContentType))
  37. {
  38. return res.NotOk("文件格式错误");
  39. }
  40. //大小限制
  41. if (!(file.Length <= config.MaxSize))
  42. {
  43. return res.NotOk("文件过大");
  44. }
  45. var fileInfo = new FileInfo(file.FileName, file.Length)
  46. {
  47. UploadPath = config.UploadPath,
  48. RequestPath = config.RequestPath
  49. };
  50. var dateTimeFormat = config.DateTimeFormat.NotNull() ? DateTime.Now.ToString(config.DateTimeFormat) : "";
  51. var format = config.Format.NotNull() ? StringHelper.Format(config.Format, args) : "";
  52. fileInfo.RelativePath = Path.Combine(dateTimeFormat, format).ToPath();
  53. if (!Directory.Exists(fileInfo.FileDirectory))
  54. {
  55. Directory.CreateDirectory(fileInfo.FileDirectory);
  56. }
  57. fileInfo.SaveName = $"{YitIdHelper.NextId()}.{fileInfo.Extension}";
  58. await SaveAsync(file, fileInfo.FilePath, cancellationToken);
  59. return res.Ok(fileInfo);
  60. }
  61. /// <summary>
  62. /// 保存文件
  63. /// </summary>
  64. /// <param name="file"></param>
  65. /// <param name="filePath"></param>
  66. /// <param name="cancellationToken"></param>
  67. /// <returns></returns>
  68. public async Task SaveAsync(IFormFile file, string filePath, CancellationToken cancellationToken = default)
  69. {
  70. using (var stream = new FileStream(filePath, FileMode.Create))
  71. {
  72. await file.CopyToAsync(stream, cancellationToken);
  73. }
  74. }
  75. }
  76. }