UploadHelper.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using Microsoft.AspNetCore.Http;
  2. using System;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using FileInfo = ZhonTai.Common.Files.FileInfo;
  8. using Yitter.IdGenerator;
  9. using ZhonTai.Admin.Core.Attributes;
  10. using ZhonTai.Common.Helpers;
  11. using ZhonTai.Admin.Core.Dto;
  12. using ZhonTai.Admin.Core.Configs;
  13. namespace ZhonTai.Admin.Core.Helpers;
  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<FileInfo> UploadAsync(IFormFile file, FileUploadConfig config, object args, CancellationToken cancellationToken = default)
  29. {
  30. if (file == null || file.Length < 1)
  31. {
  32. throw ResultOutput.Exception("请上传文件!");
  33. }
  34. //格式限制
  35. if (!config.ContentType.Contains(file.ContentType))
  36. {
  37. throw ResultOutput.Exception("文件格式错误");
  38. }
  39. //大小限制
  40. if (!(file.Length <= config.MaxSize))
  41. {
  42. throw ResultOutput.Exception("文件过大");
  43. }
  44. var fileInfo = new FileInfo(file.FileName, file.Length)
  45. {
  46. UploadPath = config.UploadPath,
  47. RequestPath = config.RequestPath
  48. };
  49. var dateTimeFormat = config.DateTimeFormat.NotNull() ? DateTime.Now.ToString(config.DateTimeFormat) : "";
  50. var format = config.Format.NotNull() ? StringHelper.Format(config.Format, args) : "";
  51. fileInfo.RelativePath = Path.Combine(dateTimeFormat, format).ToPath();
  52. if (!Directory.Exists(fileInfo.FileDirectory))
  53. {
  54. Directory.CreateDirectory(fileInfo.FileDirectory);
  55. }
  56. fileInfo.SaveName = $"{YitIdHelper.NextId()}.{fileInfo.Extension}";
  57. await SaveAsync(file, fileInfo.FilePath, cancellationToken);
  58. return fileInfo;
  59. }
  60. /// <summary>
  61. /// 保存文件
  62. /// </summary>
  63. /// <param name="file"></param>
  64. /// <param name="filePath"></param>
  65. /// <param name="cancellationToken"></param>
  66. /// <returns></returns>
  67. public async Task SaveAsync(IFormFile file, string filePath, CancellationToken cancellationToken = default)
  68. {
  69. using (var stream = File.Create(filePath))
  70. {
  71. await file.CopyToAsync(stream, cancellationToken);
  72. }
  73. }
  74. }