SysAttachFilesApplicationService.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using System.Web.Mvc;
  7. using Abp.Application.Services.Dto;
  8. using Abp.Auditing;
  9. using Abp.Authorization;
  10. using Abp.Domain.Repositories;
  11. using Abp.Extensions;
  12. using Abp.Runtime.Caching;
  13. using IwbZero.AppServiceBase;
  14. using IwbZero.IdentityFramework;
  15. using IwbZero.Setting;
  16. using ShwasherSys.BaseSysInfo.SysAttachFiles.Dto;
  17. using ShwasherSys.Lambda;
  18. namespace ShwasherSys.BaseSysInfo.SysAttachFiles
  19. {
  20. [AbpAuthorize]
  21. public class SysAttachFileAppService : ShwasherAsyncCrudAppService<SysAttachFile, SysAttachFileDto, int, PagedRequestDto, SysAttachFileCreateDto, SysAttachFileUpdateDto >
  22. , ISysAttachFileAppService
  23. {
  24. public SysAttachFileAppService(
  25. IIwbSettingManager settingManager,
  26. ICacheManager cacheManager,
  27. IRepository<SysAttachFile, int> repository) : base(repository, "AttachNo")
  28. {
  29. SettingManager = settingManager;
  30. CacheManager = cacheManager;
  31. }
  32. protected override bool KeyIsAuto { get; set; } = true;
  33. #region GetSelect
  34. [DisableAuditing]
  35. public async Task<List<SelectListItem>> GetSelectList()
  36. {
  37. var list = await Repository.GetAllListAsync();
  38. var slist = new List<SelectListItem> {new SelectListItem {Text = @"请选择...", Value = "", Selected = true}};
  39. foreach (var l in list)
  40. {
  41. slist.Add(new SelectListItem { Text = l.AttachNo, Value = l.FileTitle });
  42. }
  43. return slist;
  44. }
  45. [DisableAuditing]
  46. public async Task<string> GetSelectStr()
  47. {
  48. var list = await Repository.GetAllListAsync();
  49. string str = "<option value=\"\" selected>请选择...</option>";
  50. foreach (var l in list)
  51. {
  52. str += $"<option value=\"{l.AttachNo}\">{l.FileTitle}</option>";
  53. }
  54. return str;
  55. }
  56. [DisableAuditing]
  57. public async Task<List<SelectListItem>> GetTableSelectList(string tableName, string colName)
  58. {
  59. var list = await Repository.GetAllListAsync(a => a.TableName == tableName && a.ColumnName == colName);
  60. var slist = new List<SelectListItem> { new SelectListItem { Text = @"请选择...", Value = "", Selected = true } };
  61. foreach (var l in list)
  62. {
  63. slist.Add(new SelectListItem { Text = l.AttachNo, Value = l.FileTitle });
  64. }
  65. return slist;
  66. }
  67. [DisableAuditing]
  68. public async Task<string> GetTableSelectStr(string tableName,string colName )
  69. {
  70. var list = await Repository.GetAllListAsync(a => a.TableName == tableName && a.ColumnName == colName);
  71. string str = "<option value=\"\" selected>请选择...</option>";
  72. foreach (var l in list)
  73. {
  74. str += $"<option value=\"{l.AttachNo}\">{l.FileTitle}</option>";
  75. }
  76. return str;
  77. }
  78. #endregion
  79. #region CURD
  80. /// <summary>
  81. /// 查询附件
  82. /// </summary>
  83. /// <param name="input"></param>
  84. /// <returns></returns>
  85. public async Task<List<SysAttachFileDto>> QueryAttach(QueryAttachDto input)
  86. {
  87. var entities = await Repository.GetAllListAsync(a =>
  88. a.TableName == input.TableName && a.ColumnName == input.ColName && a.SourceKey == input.Key);
  89. return entities.Select(MapToEntityDto).ToList();
  90. }
  91. [DisableAuditing]
  92. public override async Task<PagedResultDto<SysAttachFileDto>> GetAll(PagedRequestDto input)
  93. {
  94. CheckGetAllPermission();
  95. var query = CreateFilteredQuery(input);
  96. if (input.SearchList != null && input.SearchList.Count > 0)
  97. {
  98. List<LambdaObject> objList = new List<LambdaObject>();
  99. foreach (var o in input.SearchList)
  100. {
  101. if (o.KeyWords.IsNullOrEmpty())
  102. continue;
  103. object keyWords = o.KeyWords;
  104. objList.Add(new LambdaObject
  105. {
  106. FieldType = (LambdaFieldType)o.FieldType,
  107. FieldName = o.KeyField,
  108. FieldValue = keyWords,
  109. ExpType = (LambdaExpType)o.ExpType
  110. });
  111. }
  112. var exp = objList.GetExp<SysAttachFile>();
  113. query = query.Where(exp);
  114. }
  115. var totalCount = await AsyncQueryableExecuter.CountAsync(query);
  116. query = ApplySorting(query, input);
  117. query = ApplyPaging(query, input);
  118. var entities = await AsyncQueryableExecuter.ToListAsync(query);
  119. var dtos = new PagedResultDto<SysAttachFileDto>(
  120. totalCount,
  121. entities.Select(MapToEntityDto).ToList()
  122. );
  123. return dtos;
  124. }
  125. public override async Task<SysAttachFileDto> Create(SysAttachFileCreateDto input)
  126. {
  127. if (await IsValidFileType(input.FileExt))
  128. {
  129. string filePath = $"{SettingManager.GetSettingValue(SettingNames.DownloadPath)}/{input.TableName}/{input.ColumnName}";
  130. var lcRetVal= Base64ToFile(input.FileInfo,$"{input.FileName}-{DateTime.Now:yyMMddHHmmss}{new Random().Next(1000, 9999)}", input.FileExt,filePath);
  131. if (lcRetVal.StartsWith("error@"))
  132. {
  133. CheckErrors(IwbIdentityResult.Failed(lcRetVal.Split(new[] { '@' }, StringSplitOptions.RemoveEmptyEntries)[1]));
  134. return null;
  135. }
  136. input.FilePath = lcRetVal;
  137. return await CreateEntity(input);
  138. }
  139. CheckErrors(IwbIdentityResult.Failed("文件类型不合法,请上传合法文件。"));
  140. return null;
  141. }
  142. public override async Task<SysAttachFileDto> Update(SysAttachFileUpdateDto input)
  143. {
  144. if (await IsValidFileType(input.FileExt))
  145. {
  146. string filePath = $"{SettingManager.GetSettingValue(SettingNames.DownloadPath)}/{input.TableName}/{input.ColumnName}";
  147. var lcRetVal= Base64ToFile(input.FileInfo, $"{input.FileName}-{DateTime.Now:yyMMddHHmmss}{new Random().Next(1000, 9999)}", input.FileExt,filePath);
  148. if (lcRetVal.StartsWith("error@"))
  149. {
  150. CheckErrors(IwbIdentityResult.Failed(lcRetVal.Split(new[] { '@' }, StringSplitOptions.RemoveEmptyEntries)[1]));
  151. return null;
  152. }
  153. input.FilePath = lcRetVal;
  154. return await UpdateEntity(input);
  155. }
  156. CheckErrors(IwbIdentityResult.Failed("文件类型不合法,请上传合法文件。"));
  157. return null;
  158. }
  159. public override Task Delete(EntityDto<int> input)
  160. {
  161. return Repository.DeleteAsync(input.Id);
  162. }
  163. //protected override IQueryable<SysAttachFile> ApplySorting(IQueryable<SysAttachFile> query, PagedRequestDto input)
  164. //{
  165. // return query.OrderBy(a => a.No);
  166. //}
  167. //protected override IQueryable<SysAttachFile> ApplyPaging(IQueryable<SysAttachFile> query, PagedRequestDto input)
  168. //{
  169. // if (input is IPagedResultRequest pagedInput)
  170. // {
  171. // return query.Skip(pagedInput.SkipCount).Take(pagedInput.MaxResultCount);
  172. // }
  173. // return query;
  174. //}
  175. #endregion
  176. private async Task<bool> IsValidFileType(string fileName ,bool isName=false)
  177. {
  178. string ext = isName ? GetFileExt(fileName) : fileName;
  179. string lcExts = await SettingManager.GetSettingValueAsync(SettingNames.UploadFileExt);
  180. string[] loList = lcExts.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  181. foreach (var lcExt in loList)
  182. {
  183. if (ext.ToLower() == lcExt.ToLower())
  184. return true;
  185. }
  186. this.LogError("上传的文件非法:" + fileName);
  187. return false;
  188. }
  189. private string GetFileExt(string fileName)
  190. {
  191. string fileExt = fileName.Substring(fileName.LastIndexOf(".", StringComparison.Ordinal) + 1, fileName.Length - fileName.LastIndexOf(".", StringComparison.Ordinal) - 1);
  192. return fileExt.ToLower();
  193. }
  194. public static string Base64ToFile( string base64Str, string fileName, string fileExt, string filePath)
  195. {
  196. string lcRetVal = "error@";
  197. try
  198. {
  199. fileName = $"{fileName}.{fileExt}";
  200. filePath = filePath.StartsWith("/") ? filePath : ("/" + filePath);
  201. filePath = filePath.EndsWith("/") ? filePath : (filePath + "/");
  202. string path = $"{AppDomain.CurrentDomain.BaseDirectory}{filePath}";
  203. if (!Directory.Exists(path))
  204. Directory.CreateDirectory(path);
  205. byte[] bytes = Convert.FromBase64String(base64Str);
  206. using (FileStream fs = new FileStream($"{path}{fileName}", FileMode.Create, FileAccess.Write))
  207. {
  208. fs.Write(bytes, 0, bytes.Length);
  209. fs.Close();
  210. }
  211. lcRetVal = filePath + fileName;
  212. }
  213. catch (Exception e)
  214. {
  215. typeof(SysAttachFileAppService).LogError(e);
  216. lcRetVal += "文件上传异常。";
  217. }
  218. return lcRetVal;
  219. }
  220. }
  221. }