AttachFileManager.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. using System;
  2. using System.IO;
  3. using System.Threading.Tasks;
  4. using Abp.Auditing;
  5. using Abp.AutoMapper;
  6. using Abp.Configuration;
  7. using Abp.Dependency;
  8. using Abp.Domain.Repositories;
  9. using Abp.Localization;
  10. using Abp.Localization.Sources;
  11. using Abp.ObjectMapping;
  12. using Abp.UI;
  13. using WeApp.BaseInfo;
  14. using WeApp.Configuration;
  15. using IwbZero;
  16. using IwbZero.ToolCommon.LogHelpers;
  17. using WeApp.CommonManager.AppGuids;
  18. using IwbZero.ToolCommon.StringModel;
  19. namespace WeApp.CommonManager.AttachFiles
  20. {
  21. public class AttachFileManager : IAttachFileManager, ISingletonDependency
  22. {
  23. public AttachFileManager(ISettingManager settingManager, IRepository<SysAttachFile> repository, IAppGuidManager appGuidManager)
  24. {
  25. SettingManager = settingManager;
  26. Repository = repository;
  27. AppGuidManager = appGuidManager;
  28. ObjectMapper = SingletonDependency<AutoMapperObjectMapper>.Instance;
  29. // ObjectMapper = resolver.Resolve<AutoMapperObjectMapper>();
  30. }
  31. private IAppGuidManager AppGuidManager { get; }
  32. private ISettingManager SettingManager { get; }
  33. private IRepository<SysAttachFile> Repository { get; }
  34. private IObjectMapper ObjectMapper { get; }
  35. /// <summary>
  36. /// 上传附件
  37. /// </summary>
  38. /// <param name="input"></param>
  39. /// <returns></returns>
  40. [DisableAuditing]
  41. public async Task FileUpload(AttachFileCreateDto input)
  42. {
  43. if (await IsValidFileType(input))
  44. {
  45. if (string.IsNullOrEmpty(input.AttachNo))
  46. {
  47. input.AttachNo = AppGuidManager.GetNextRecordId(DataLibType.Attach);
  48. }
  49. string filePath = string.IsNullOrEmpty(input.FilePath)
  50. ? $"{SettingManager.GetSettingValue(IwbSettingNames.DownloadPath)}/{input.TableName}/{input.ColumnName}"
  51. : input.FilePath;
  52. var lcRetVal = Base64ToFile(input.FileInfo, $"{input.FileName}-{DateTime.Now:yyMMddHHmmssfff}", input.FileExt, filePath);
  53. if (lcRetVal.StartsWith("error@"))
  54. {
  55. throw new UserFriendlyException(lcRetVal.Split(new[] { '@' }, StringSplitOptions.RemoveEmptyEntries)[1]);
  56. }
  57. input.FilePath = lcRetVal;
  58. var entity = await Repository.FirstOrDefaultAsync(a =>
  59. a.TableName == input.TableName && a.ColumnName == input.ColumnName &&
  60. a.SourceKey == input.SourceKey);
  61. if (entity == null)
  62. {
  63. entity = ObjectMapper.Map<SysAttachFile>(input);
  64. await Repository.InsertAsync(entity);
  65. }
  66. else
  67. {
  68. entity.FileExt = input.FileExt;
  69. entity.FileName = input.FileName;
  70. entity.FileTitle = input.FileTitle;
  71. entity.FilePath = lcRetVal;
  72. entity.FileType = input.FileType;
  73. await Repository.UpdateAsync(entity);
  74. }
  75. return;
  76. }
  77. var allowExts = string.IsNullOrEmpty(input.AllowExt)
  78. ? await SettingManager.GetSettingValueAsync(IwbSettingNames.UploadFileExt)
  79. : input.AllowExt;
  80. throw new UserFriendlyException(string.Format(L("FileUploadFileTypeInvalidFormatter"), $"{input.FileName}.{input.FileExt}", allowExts));
  81. }
  82. /// <summary>
  83. /// 上传附件
  84. /// </summary>
  85. /// <returns></returns>
  86. [DisableAuditing]
  87. public async Task FileUpload(string fileInfo, string filePath, string fileName, string fileExt)
  88. {
  89. if (await IsValidFileType(fileExt))
  90. {
  91. var lcRetVal = Base64ToFile(fileInfo, $"{fileName}", fileExt, filePath);
  92. if (lcRetVal.StartsWith("error@"))
  93. {
  94. throw new UserFriendlyException(lcRetVal.Split(new[] { '@' }, StringSplitOptions.RemoveEmptyEntries)[1]);
  95. }
  96. return;
  97. }
  98. var allowExts = await SettingManager.GetSettingValueAsync(IwbSettingNames.UploadFileExt);
  99. throw new UserFriendlyException(string.Format(L("FileUploadFileTypeInvalidFormatter"), $"{fileName}.{fileExt}", allowExts));
  100. }
  101. private async Task<bool> IsValidFileType(AttachFileCreateDto input)
  102. {
  103. return await IsValidFileType(input.FileExt, input.AllowExt, false, string.IsNullOrEmpty(input.AllowExt));
  104. }
  105. private async Task<bool> IsValidFileType(string fileName, string allowExts = null, bool isName = false,
  106. bool checkAll = false)
  107. {
  108. string ext = isName ? GetFileExt(fileName) : fileName;
  109. allowExts = checkAll
  110. ? $"{allowExts ?? ""},{await SettingManager.GetSettingValueAsync(IwbSettingNames.UploadFileExt)}"
  111. : allowExts;
  112. if (string.IsNullOrEmpty(allowExts))
  113. return true;
  114. string[] extList = allowExts.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  115. foreach (var e in extList)
  116. {
  117. if (ext.ToLower() == e.ToLower())
  118. return true;
  119. }
  120. this.LogError("上传的文件非法:" + fileName);
  121. return false;
  122. }
  123. private string GetFileExt(string fileName)
  124. {
  125. string fileExt = fileName.Substring(fileName.LastIndexOf(".", StringComparison.Ordinal) + 1, fileName.Length - fileName.LastIndexOf(".", StringComparison.Ordinal) - 1);
  126. return fileExt.ToLower();
  127. }
  128. private string Base64ToFile(string base64Str, string fileName, string fileExt, string filePath)
  129. {
  130. string lcRetVal = "error@";
  131. try
  132. {
  133. fileName = $"{fileName}.{fileExt}";
  134. filePath = filePath.Sw("/");
  135. filePath = filePath.Ew("/");
  136. string path = $"{AppDomain.CurrentDomain.BaseDirectory}{filePath}";
  137. if (!Directory.Exists(path))
  138. Directory.CreateDirectory(path);
  139. byte[] bytes = Convert.FromBase64String(base64Str);
  140. using (FileStream fs = new FileStream($"{path}{fileName}", FileMode.Create, FileAccess.Write))
  141. {
  142. fs.Write(bytes, 0, bytes.Length);
  143. fs.Close();
  144. }
  145. lcRetVal = filePath + fileName;
  146. }
  147. catch (Exception e)
  148. {
  149. this.LogError(e);
  150. lcRetVal += "FileUploadException";
  151. }
  152. return lcRetVal;
  153. }
  154. private string L(string name, params object[] args)
  155. {
  156. return LocalizationHelper.GetSource(IwbZeroConsts.LocalizationSourceName).GetString(name, args);
  157. }
  158. }
  159. }