DigitalManufacturingAppService.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using DigitalManufacturing.Core;
  2. using DigitalManufacturing.Enums;
  3. using DigitalManufacturing.FileManagement.Dto;
  4. using DigitalManufacturing.Models;
  5. using Microsoft.AspNetCore.Http;
  6. using Microsoft.AspNetCore.Mvc;
  7. using Microsoft.EntityFrameworkCore;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.ComponentModel.DataAnnotations;
  11. using System.IO;
  12. using System.Linq;
  13. using System.Linq.Dynamic.Core;
  14. using System.Threading.Tasks;
  15. using Volo.Abp;
  16. using Volo.Abp.Application.Dtos;
  17. using Volo.Abp.Application.Services;
  18. using Volo.Abp.DependencyInjection;
  19. using Volo.Abp.Domain.Repositories;
  20. using Volo.Abp.MultiTenancy;
  21. using FileInfo = DigitalManufacturing.Models.FileInfo;
  22. namespace DigitalManufacturing.DigitalManufacturingManagement
  23. {
  24. public class DigitalManufacturingAppService : ApplicationService, IDigitalManufacturingAppService, ITransientDependency
  25. {
  26. private readonly ICurrentTenant _currentTenant;
  27. private readonly IRepository<FileInfo, Guid> _repository;
  28. private readonly FileManager _fileManager;
  29. string[] pictureFormatArray = { ".png", ".jpg", ".jpeg", ".gif", ".PNG", ".JPG", ".JPEG", ".GIF" };
  30. public DigitalManufacturingAppService(IRepository<FileInfo, Guid> repository, FileManager fileManager, ICurrentTenant currentTenant)
  31. {
  32. _repository = repository;
  33. _fileManager = fileManager;
  34. _currentTenant = currentTenant;
  35. }
  36. public async Task<PagedResultDto<FileInfoDto>> GetAll(GetFileInputDto input)
  37. {
  38. var query = (await _repository.GetQueryableAsync()).WhereIf(!string.IsNullOrWhiteSpace(input.Filter), _ => _.Name.Contains(input.Filter));
  39. var totalCount = await query.CountAsync();
  40. var items = await query.OrderBy(input.Sorting ?? "Name")
  41. .Skip(input.SkipCount)
  42. .Take(input.MaxResultCount)
  43. .ToListAsync();
  44. var dtos = ObjectMapper.Map<List<FileInfo>, List<FileInfoDto>>(items);
  45. return new PagedResultDto<FileInfoDto>(totalCount, dtos);
  46. }
  47. public async Task<FileInfoDto> Upload([Required] string name, [Required] IFormFile file)
  48. {
  49. if (file == null || file.Length == 0) throw new BusinessException("无法上传空文件");
  50. //限制100M
  51. if (file.Length > 104857600)
  52. {
  53. NLogHelper.Default.WriteLog("GetAll", "上传文件过大", _currentTenant.Id.ToString());
  54. new NLogHelper("DigitalManufacturingAppService").WriteLog("GetAll", "自定义logger", _currentTenant.Id.ToString());
  55. throw new BusinessException("上传文件过大");
  56. }
  57. //文件格式
  58. var fileExtension = Path.GetExtension(file.FileName);
  59. if (!pictureFormatArray.Contains(fileExtension))
  60. {
  61. throw new BusinessException("上传文件格式错误");
  62. }
  63. var size = "";
  64. if (file.Length < 1024)
  65. size = file.Length.ToString() + "B";
  66. else if (file.Length >= 1024 && file.Length < 1048576)
  67. size = ((float)file.Length / 1024).ToString("F2") + "KB";
  68. else if (file.Length >= 1048576 && file.Length < 104857600)
  69. size = ((float)file.Length / 1024 / 1024).ToString("F2") + "MB";
  70. else size = file.Length.ToString() + "B";
  71. string uploadsFolder = Path.Combine(Environment.CurrentDirectory, "wwwroot", "files");
  72. if (!Directory.Exists(uploadsFolder))
  73. {
  74. Directory.CreateDirectory(uploadsFolder);
  75. }
  76. var uniqueFileName = Guid.NewGuid().ToString() + fileExtension;
  77. string filePath = Path.Combine(uploadsFolder, uniqueFileName);
  78. using (var fileStream = new FileStream(filePath, FileMode.Create))
  79. {
  80. file.CopyTo(fileStream);
  81. fileStream.Flush();
  82. }
  83. //TODO:文件md5哈希校验
  84. var result = await _fileManager.Create(name, uniqueFileName, fileExtension, "", size, filePath, "/files/" + uniqueFileName, FileType.Image);
  85. return ObjectMapper.Map<FileInfo, FileInfoDto>(result);
  86. }
  87. public async Task UploadPrivate([Required] string name, [Required] IFormFile file)
  88. {
  89. if (file == null || file.Length == 0) throw new BusinessException("无法上传空文件");
  90. if (file.Length > 104857600) throw new BusinessException("上传文件过大");
  91. var fileExtension = Path.GetExtension(file.FileName);
  92. if (!pictureFormatArray.Contains(fileExtension)) throw new BusinessException("上传文件格式错误");
  93. var size = "";
  94. if (file.Length < 1024)
  95. size = file.Length.ToString() + "B";
  96. else if (file.Length >= 1024 && file.Length < 1048576)
  97. size = ((float)file.Length / 1024).ToString("F2") + "KB";
  98. else if (file.Length >= 1048576 && file.Length < 104857600)
  99. size = ((float)file.Length / 1024 / 1024).ToString("F2") + "MB";
  100. else size = file.Length.ToString() + "B";
  101. string uploadsFolder = Path.Combine(Environment.CurrentDirectory, "files");
  102. if (!Directory.Exists(uploadsFolder)) Directory.CreateDirectory(uploadsFolder);
  103. var uniqueFileName = Guid.NewGuid().ToString() + fileExtension;
  104. string filePath = Path.Combine(uploadsFolder, uniqueFileName);
  105. using (var fileStream = new FileStream(filePath, FileMode.Create))
  106. {
  107. file.CopyTo(fileStream);
  108. fileStream.Flush();
  109. }
  110. await _fileManager.Create(name, uniqueFileName, fileExtension, "", size, filePath, "/files/" + uniqueFileName, FileType.Image);
  111. }
  112. public dynamic Download([Required] string name)
  113. {
  114. var filePath = Path.Combine(Environment.CurrentDirectory, "files", name);
  115. if (!File.Exists(filePath)) throw new BusinessException("找不到文件");
  116. return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = name };
  117. }
  118. }
  119. }