CommonController.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. using Infrastructure;
  2. using Infrastructure.Attribute;
  3. using Infrastructure.Enums;
  4. using Infrastructure.Extensions;
  5. using Infrastructure.Model;
  6. using Microsoft.AspNetCore.Hosting;
  7. using Microsoft.AspNetCore.Http;
  8. using Microsoft.AspNetCore.Mvc;
  9. using Microsoft.Extensions.Options;
  10. using Newtonsoft.Json;
  11. using System;
  12. using System.IO;
  13. using System.Linq;
  14. using System.Threading.Tasks;
  15. using ZR.Admin.WebApi.Extensions;
  16. using ZR.Admin.WebApi.Filters;
  17. using ZR.Common;
  18. using ZR.Model.System;
  19. using ZR.Model.System.Dto;
  20. using ZR.Service.System.IService;
  21. namespace ZR.Admin.WebApi.Controllers
  22. {
  23. /// <summary>
  24. /// 公共模块
  25. /// </summary>
  26. [Route("[controller]/[action]")]
  27. public class CommonController : BaseController
  28. {
  29. private OptionsSetting OptionsSetting;
  30. private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
  31. private IWebHostEnvironment WebHostEnvironment;
  32. private ISysFileService SysFileService;
  33. /// <summary>
  34. ///
  35. /// </summary>
  36. /// <param name="options"></param>
  37. /// <param name="webHostEnvironment"></param>
  38. /// <param name="fileService"></param>
  39. public CommonController(IOptions<OptionsSetting> options, IWebHostEnvironment webHostEnvironment, ISysFileService fileService)
  40. {
  41. WebHostEnvironment = webHostEnvironment;
  42. SysFileService = fileService;
  43. OptionsSetting = options.Value;
  44. }
  45. /// <summary>
  46. /// hello
  47. /// </summary>
  48. /// <returns></returns>
  49. [Route("/")]
  50. [HttpGet]
  51. public IActionResult Index()
  52. {
  53. return Ok("看到这里页面说明你已经成功启动了本项目:)\n\n" +
  54. "如果觉得项目有用,打赏作者喝杯咖啡作为奖励\n☛☛http://www.izhaorui.cn/doc/support.html\n");
  55. }
  56. /// <summary>
  57. /// 发送邮件
  58. /// </summary>
  59. /// <param name="sendEmailVo">请求参数接收实体</param>
  60. /// <returns></returns>
  61. [ActionPermissionFilter(Permission = "tool:email:send")]
  62. [Log(Title = "发送邮件", IsSaveRequestData = false)]
  63. [HttpPost]
  64. public IActionResult SendEmail([FromBody] SendEmailDto sendEmailVo)
  65. {
  66. if (sendEmailVo == null || string.IsNullOrEmpty(sendEmailVo.Subject) || string.IsNullOrEmpty(sendEmailVo.ToUser))
  67. {
  68. return ToResponse(ApiResult.Error($"请求参数不完整"));
  69. }
  70. if (string.IsNullOrEmpty(OptionsSetting.MailOptions.From) || string.IsNullOrEmpty(OptionsSetting.MailOptions.Password))
  71. {
  72. return ToResponse(ApiResult.Error($"请配置邮箱信息"));
  73. }
  74. MailHelper mailHelper = new();
  75. string[] toUsers = sendEmailVo.ToUser.Split(",", StringSplitOptions.RemoveEmptyEntries);
  76. if (sendEmailVo.SendMe)
  77. {
  78. toUsers.Append(mailHelper.FromEmail);
  79. }
  80. mailHelper.SendMail(toUsers, sendEmailVo.Subject, sendEmailVo.Content, sendEmailVo.FileUrl, sendEmailVo.HtmlContent);
  81. logger.Info($"发送邮件{JsonConvert.SerializeObject(sendEmailVo)}");
  82. return SUCCESS(true);
  83. }
  84. #region 上传
  85. /// <summary>
  86. /// 存储文件
  87. /// </summary>
  88. /// <param name="uploadDto">自定义文件名</param>
  89. /// <param name="storeType">上传类型1、保存到本地 2、保存到阿里云</param>
  90. /// <returns></returns>
  91. [HttpPost()]
  92. [Verify]
  93. [ActionPermissionFilter(Permission = "common")]
  94. public async Task<IActionResult> UploadFile([FromForm] UploadDto uploadDto, StoreType storeType = StoreType.LOCAL)
  95. {
  96. IFormFile? formFile = uploadDto.File;
  97. if (formFile == null) throw new CustomException(ResultCode.PARAM_ERROR, "上传文件不能为空");
  98. SysFile file = new();
  99. string fileExt = Path.GetExtension(formFile.FileName);//文件后缀
  100. double fileSize = Math.Round(formFile.Length / 1024.0, 2);//文件大小KB
  101. if (OptionsSetting.Upload.NotAllowedExt.Contains(fileExt))
  102. {
  103. return ToResponse(ResultCode.CUSTOM_ERROR, "上传失败,未经允许上传类型");
  104. }
  105. if (uploadDto.FileNameType == 1)
  106. {
  107. uploadDto.FileName = Path.GetFileNameWithoutExtension(formFile.FileName);
  108. }
  109. else if (uploadDto.FileNameType == 3)
  110. {
  111. uploadDto.FileName = SysFileService.HashFileName();
  112. }
  113. switch (storeType)
  114. {
  115. case StoreType.LOCAL:
  116. string savePath = Path.Combine(WebHostEnvironment.WebRootPath);
  117. if (uploadDto.FileDir.IsEmpty())
  118. {
  119. uploadDto.FileDir = OptionsSetting.Upload.LocalSavePath;
  120. }
  121. file = await SysFileService.SaveFileToLocal(savePath, uploadDto.FileName, uploadDto.FileDir, HttpContext.GetName(), formFile);
  122. break;
  123. case StoreType.REMOTE:
  124. break;
  125. case StoreType.ALIYUN:
  126. int AlimaxContentLength = OptionsSetting.ALIYUN_OSS.MaxSize;
  127. if (OptionsSetting.ALIYUN_OSS.REGIONID.IsEmpty())
  128. {
  129. return ToResponse(ResultCode.CUSTOM_ERROR, "配置文件缺失");
  130. }
  131. if ((fileSize / 1024) > AlimaxContentLength)
  132. {
  133. return ToResponse(ResultCode.CUSTOM_ERROR, "上传文件过大,不能超过 " + AlimaxContentLength + " MB");
  134. }
  135. file = new(formFile.FileName, uploadDto.FileName, fileExt, fileSize + "kb", uploadDto.FileDir, HttpContext.GetName())
  136. {
  137. StoreType = (int)StoreType.ALIYUN,
  138. FileType = formFile.ContentType
  139. };
  140. file = await SysFileService.SaveFileToAliyun(file, formFile);
  141. if (file.Id <= 0) { return ToResponse(ApiResult.Error("阿里云连接失败")); }
  142. break;
  143. case StoreType.TENCENT:
  144. break;
  145. case StoreType.QINIU:
  146. break;
  147. default:
  148. break;
  149. }
  150. return SUCCESS(new
  151. {
  152. url = file.AccessUrl,
  153. fileName = file.FileName,
  154. fileId = file.Id.ToString()
  155. });
  156. }
  157. #endregion
  158. }
  159. /// <summary>
  160. ///
  161. /// </summary>
  162. public class UploadDto
  163. {
  164. /// <summary>
  165. /// 自定文件名
  166. /// </summary>
  167. public string? FileName { get; set; }
  168. /// <summary>
  169. /// 存储目录
  170. /// </summary>
  171. public string? FileDir { get; set; }
  172. /// <summary>
  173. /// 文件名生成类型 1 原文件名 2 自定义 3 自动生成
  174. /// </summary>
  175. public int FileNameType { get; set; }
  176. /// <summary>
  177. ///
  178. /// </summary>
  179. public IFormFile? File { get; set; }
  180. }
  181. }