颐和api

UploadController.cs 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Microsoft.AspNetCore.Mvc;
  6. using Microsoft.Extensions.Configuration;
  7. using Microsoft.AspNetCore.Authorization;
  8. using Microsoft.Extensions.Caching.Distributed;
  9. using Api.SignToken;
  10. using Microsoft.Extensions.Logging;
  11. using MadRunFabric.Common;
  12. using Microsoft.AspNetCore.Hosting;
  13. using FileServerApi.Common;
  14. using System.IO;
  15. using Microsoft.AspNetCore.Http;
  16. using System.Web;
  17. using Microsoft.AspNetCore.StaticFiles;
  18. using System.Text;
  19. namespace FileServerApi.Controllers
  20. {
  21. [ApiVersion("6.0")]
  22. //[Authorize]
  23. //[RequestSizeLimit(1073741822)]//1GB
  24. [DisableRequestSizeLimit]//无限制
  25. [Route("api/[controller]")]
  26. public class UploadController : BaseController
  27. {
  28. private readonly IConfiguration _configuration;
  29. private readonly IHostingEnvironment _hostingEnvironment;
  30. private readonly IDistributedCache _cache;
  31. private static IPermissionService _permissionService;
  32. private readonly ILogger<UploadController> _logger;
  33. public UploadController(IHostingEnvironment hostingEnvironment, IConfiguration configuration, IDistributedCache cache, IPermissionService permissionService, ILogger<UploadController> logger)
  34. {
  35. _hostingEnvironment = hostingEnvironment;
  36. _configuration = configuration;
  37. _cache = cache;
  38. _permissionService = permissionService;
  39. _logger = logger;
  40. }
  41. /// <summary>
  42. /// 获取附件/删除附件
  43. /// </summary>
  44. /// <param name="key"></param>
  45. /// <param name="isdel"></param>
  46. /// <returns></returns>
  47. [HttpGet("{key}")]
  48. public IActionResult Get(string key, int isdel = 0)
  49. {
  50. string pathname = DESEncrypt.DecryptDES(key);
  51. string[] strs = pathname.Split("||");
  52. if (isdel > 0)
  53. {
  54. System.IO.File.Delete(strs[0]);
  55. return Success("删除成功");
  56. }
  57. _logger.LogDebug("文件路径:" + pathname);
  58. //_logger.LogError("文件路径:" + pathname);
  59. if (System.IO.File.Exists(strs[0]))
  60. {
  61. //var stream = System.IO.File.OpenRead(strs[0]);
  62. var fileExt = Path.GetExtension(strs[1]);
  63. ////获取文件的ContentType
  64. //var provider = new FileExtensionContentTypeProvider();
  65. //var memi = provider.Mappings[fileExt];
  66. //return File(stream, memi, Path.GetFileName(strs[1]));
  67. //IE在处理 Response Header 的时候,对header的长度限制在150字节左右。而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以会
  68. System.Net.Mime.ContentDisposition cd = new System.Net.Mime.ContentDisposition
  69. {
  70. FileName = GetSubstr(strs[1]), // Path.GetFileName(strs[1]),
  71. Inline = false // false = prompt the user for downloading; true = browser to try to show the file inline
  72. };
  73. Response.Headers.Add("Content-Disposition", cd.ToString());
  74. Response.Headers.Add("X-Content-Type-Options", "nosniff");
  75. return File(System.IO.File.ReadAllBytes(strs[0]), "application/octet-stream");
  76. }
  77. else
  78. {
  79. string[] filetypes = new string[] { ".jpg", ".jpeg", ".gif", ".bmp", ".png" };
  80. var defaultbase64 = _configuration["File:defaultfile"].ToString();
  81. if (filetypes.Contains(Path.GetExtension(strs[1])))
  82. {
  83. defaultbase64 = _configuration["File:defaultphoto"].ToString();
  84. }
  85. int delLength = defaultbase64.IndexOf(',') + 1;
  86. string strimg = defaultbase64.Substring(delLength, defaultbase64.Length - delLength);
  87. byte[] bData = Convert.FromBase64String(strimg);
  88. //return File(bData, "image/jpeg", "error.jpg");
  89. System.Net.Mime.ContentDisposition cd = new System.Net.Mime.ContentDisposition
  90. {
  91. FileName = "error.jpg",
  92. Inline = false // false = prompt the user for downloading; true = browser to try to show the file inline
  93. };
  94. Response.Headers.Add("Content-Disposition", cd.ToString());
  95. Response.Headers.Add("X-Content-Type-Options", "nosniff");
  96. return File(bData, "image/jpeg");
  97. }
  98. }
  99. /// <summary>
  100. /// 上传附件
  101. /// </summary>
  102. /// <param name="cols"></param>
  103. /// <returns></returns>
  104. //[Consumes("application/json", "multipart/form-data")]
  105. [HttpPost]
  106. public async Task<IActionResult> Post(IFormCollection cols)
  107. {
  108. try
  109. {
  110. string type = cols["uploadtype"];
  111. if (string.IsNullOrEmpty(type)) type = _configuration["File:type"].ToString();
  112. string webRootPath = _hostingEnvironment.WebRootPath;
  113. string contentRootPath = _hostingEnvironment.ContentRootPath;
  114. string urlpre = _configuration["File:url"].ToString() + "/api/Upload/";
  115. string pre = _configuration["File:path"].ToString();
  116. var path = (string.IsNullOrEmpty(pre) ? contentRootPath + "/upload/" : pre) + type + "/";
  117. path = path + DateTime.Now.ToString("yyyy") + "/" + DateTime.Now.ToString("MM") + "/" + DateTime.Now.ToString("dd") + "/";
  118. if (!Directory.Exists(path)) Directory.CreateDirectory(path);
  119. List<FileClass.FileInfo> strfiles = new List<FileClass.FileInfo>();
  120. string filesjson = cols["filesjson"];
  121. if (!string.IsNullOrEmpty(filesjson))
  122. {
  123. List<FileClass.Base64Info> jsons = filesjson.ToList<FileClass.Base64Info>();
  124. foreach (var l in jsons)
  125. {
  126. int delLength = l.fileurl.IndexOf(',') + 1;
  127. string strimg = l.fileurl.Substring(delLength, l.fileurl.Length - delLength);
  128. byte[] bData = Convert.FromBase64String(strimg);
  129. string fileExt = Path.GetExtension(l.filename); //文件扩展名,含“.”
  130. long fileSize = bData.Length; //获得文件大小,以字节为单位
  131. string newFileName = System.Guid.NewGuid().ToString() + fileExt; //随机生成新的文件名
  132. using (var stream = new FileStream(path + newFileName, FileMode.Create))
  133. {
  134. await stream.WriteAsync(bData,0, bData.Length);
  135. }
  136. string filemd5 = Common.Common.GetMD5HashFromFile(path + newFileName);
  137. string key = DESEncrypt.EncryptDES(path + newFileName + "||" + l.filename);
  138. FileClass.FileInfo fl = new FileClass.FileInfo();
  139. fl.fileext = fileExt;
  140. fl.filename = l.filename;
  141. fl.filesize = fileSize.ToString();
  142. fl.fileurl = urlpre + key;
  143. try
  144. {
  145. string slname = Common.Common.GetThumbImg(path, newFileName, fileExt);
  146. if (slname != "")
  147. {
  148. string slkey = DESEncrypt.EncryptDES(path + slname + "||" + l.filename);
  149. fl.filesmallurl = urlpre + slkey;
  150. }
  151. }
  152. catch (Exception ex)
  153. {
  154. _logger.LogError("生成缩略图失败,原因:" + ex.ToString());
  155. fl.filesmallurl = urlpre + key;
  156. }
  157. fl.filemd5 = filemd5;
  158. strfiles.Add(fl);
  159. }
  160. }
  161. foreach (var file in cols.Files)
  162. {
  163. string fileName = file.FileName;
  164. string fileExt = Path.GetExtension(fileName); //文件扩展名,含“.”
  165. long fileSize = file.Length; //获得文件大小,以字节为单位
  166. string newFileName = System.Guid.NewGuid().ToString() + fileExt; //随机生成新的文件名
  167. using (var stream = new FileStream(path + newFileName, FileMode.Create))
  168. {
  169. await file.CopyToAsync(stream);
  170. }
  171. string filemd5 = Common.Common.GetMD5HashFromFile(path + newFileName);
  172. string key = DESEncrypt.EncryptDES(path + newFileName + "||" + fileName);
  173. FileClass.FileInfo fl = new FileClass.FileInfo();
  174. fl.fileext = fileExt;
  175. fl.filename = fileName;
  176. fl.filesize = fileSize.ToString();
  177. fl.fileurl = urlpre + key;
  178. try
  179. {
  180. string slname = Common.Common.GetThumbImg(path, newFileName, fileExt);
  181. if (slname != "")
  182. {
  183. string slkey = DESEncrypt.EncryptDES(path + slname + "||" + fileName);
  184. fl.filesmallurl = urlpre + slkey;
  185. }
  186. }
  187. catch (Exception ex)
  188. {
  189. _logger.LogError("生成缩略图失败,原因:" + ex.ToString());
  190. fl.filesmallurl = urlpre + key;
  191. }
  192. fl.filemd5 = filemd5;
  193. strfiles.Add(fl);
  194. }
  195. return Success("上传成功", strfiles);
  196. }
  197. catch(Exception ex)
  198. {
  199. return Error("上传失败,原因:" + ex.ToString());
  200. }
  201. }
  202. /// <summary>
  203. /// 获取缩短的文件标题 - 例如:aaaaaa..bbbb.pfd
  204. /// </summary>
  205. /// <param name="unicodeString"></param>
  206. /// <returns></returns>
  207. public string GetSubstr(string str)
  208. {
  209. try
  210. {
  211. //类型 .pdf - 截取.后面的字符串
  212. string Extension = str.Substring(str.LastIndexOf("."));
  213. //名称 - 截取.前面的字符串
  214. string title = str.Remove(str.LastIndexOf("."));
  215. //名称不为空
  216. if (!string.IsNullOrEmpty(title))
  217. {
  218. if (title.Length > 9)
  219. {
  220. //IE在处理 Response Header 的时候,对header的长度限制在150字节左右。而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以会
  221. string Str_before = title.Substring(0, 5);
  222. string Str_after = title.Substring(title.Length - 4, 4);
  223. //拼接字符串 例如:aaaaaa..bbbb.pfd
  224. return Str_before + ".." + Str_after + Extension;
  225. }
  226. return title + Extension;
  227. }
  228. return str;
  229. }
  230. catch (Exception ex)
  231. {
  232. return DateTimeHelper.GetDateTime();
  233. }
  234. }
  235. /// <summary>
  236. /// 删除附件
  237. /// </summary>
  238. /// <param name="keys"></param>
  239. /// <returns></returns>
  240. [HttpDelete]
  241. public IActionResult Delete(string keys)
  242. {
  243. foreach (string key in keys.Split(","))
  244. {
  245. string pathname = DESEncrypt.DecryptDES(key);
  246. string[] strs = pathname.Split("||");
  247. System.IO.File.Delete(strs[0]);
  248. }
  249. return Success("删除成功");
  250. }
  251. /// <summary>
  252. /// 解密
  253. /// </summary>
  254. /// <param name="key"></param>
  255. /// <returns></returns>
  256. [HttpGet("decrypt")]
  257. public IActionResult Decrypt(string key)
  258. {
  259. return Success("解密成功",DESEncrypt.DecryptDES(key));
  260. }
  261. /// <summary>
  262. /// 加密
  263. /// </summary>
  264. /// <param name="path"></param>
  265. /// <returns></returns>
  266. [HttpGet("encrypt")]
  267. public IActionResult Encrypt(string path)
  268. {
  269. return Success("加密成功", DESEncrypt.EncryptDES(HttpUtility.UrlDecode(path)));
  270. }
  271. [HttpPost("updateimg")]
  272. public async Task<IActionResult> updateimg(IFormCollection cols)
  273. {
  274. try
  275. {
  276. string type = cols["uploadtype"];
  277. if (string.IsNullOrEmpty(type)) type = _configuration["File:type"].ToString();
  278. string webRootPath = _hostingEnvironment.WebRootPath;
  279. string contentRootPath = _hostingEnvironment.ContentRootPath;
  280. string urlpre = _configuration["File:url"].ToString() + "/api/Upload/";
  281. string pre = _configuration["File:path"].ToString();
  282. var path = (string.IsNullOrEmpty(pre) ? contentRootPath + "/upload/" : pre) + type + "/";
  283. path = path + DateTime.Now.ToString("yyyy") + "/" + DateTime.Now.ToString("MM") + "/" + DateTime.Now.ToString("dd") + "/";
  284. if (!Directory.Exists(path)) Directory.CreateDirectory(path);
  285. List<FileClass.FileInfo> strfiles = new List<FileClass.FileInfo>();
  286. string filesjson = cols["filesjson"];
  287. if (!string.IsNullOrEmpty(filesjson))
  288. {
  289. List<FileClass.Base64Info> jsons = filesjson.ToList<FileClass.Base64Info>();
  290. foreach (var l in jsons)
  291. {
  292. int delLength = l.fileurl.IndexOf(',') + 1;
  293. string strimg = l.fileurl.Substring(delLength, l.fileurl.Length - delLength);
  294. byte[] bData = Convert.FromBase64String(strimg);
  295. string fileExt = Path.GetExtension(l.filename); //文件扩展名,含“.”
  296. long fileSize = bData.Length; //获得文件大小,以字节为单位
  297. string newFileName = System.Guid.NewGuid().ToString() + fileExt; //随机生成新的文件名
  298. using (var stream = new FileStream(path + newFileName, FileMode.Create))
  299. {
  300. await stream.WriteAsync(bData, 0, bData.Length);
  301. }
  302. string filemd5 = Common.Common.GetMD5HashFromFile(path + newFileName);
  303. string key = DESEncrypt.EncryptDES(path + newFileName + "||" + l.filename);
  304. FileClass.FileInfo fl = new FileClass.FileInfo();
  305. fl.fileext = fileExt;
  306. fl.filename = l.filename;
  307. fl.filesize = fileSize.ToString();
  308. fl.fileurl = urlpre + key;
  309. try
  310. {
  311. string slname = Common.Common.GetThumbImg(path, newFileName, fileExt);
  312. if (slname != "")
  313. {
  314. string slkey = DESEncrypt.EncryptDES(path + slname + "||" + l.filename);
  315. fl.filesmallurl = urlpre + slkey;
  316. }
  317. }
  318. catch (Exception ex)
  319. {
  320. _logger.LogError("生成缩略图失败,原因:" + ex.ToString());
  321. fl.filesmallurl = urlpre + key;
  322. }
  323. fl.filemd5 = filemd5;
  324. strfiles.Add(fl);
  325. }
  326. }
  327. foreach (var file in cols.Files)
  328. {
  329. string fileName = file.FileName;
  330. string fileExt = Path.GetExtension(fileName); //文件扩展名,含“.”
  331. long fileSize = file.Length; //获得文件大小,以字节为单位
  332. string newFileName = System.Guid.NewGuid().ToString() + fileExt; //随机生成新的文件名
  333. using (var stream = new FileStream(path + newFileName, FileMode.Create))
  334. {
  335. await file.CopyToAsync(stream);
  336. }
  337. string filemd5 = Common.Common.GetMD5HashFromFile(path + newFileName);
  338. string key = DESEncrypt.EncryptDES(path + newFileName + "||" + fileName);
  339. FileClass.FileInfo fl = new FileClass.FileInfo();
  340. fl.fileext = fileExt;
  341. fl.filename = fileName;
  342. fl.filesize = fileSize.ToString();
  343. fl.fileurl = urlpre + key;
  344. try
  345. {
  346. string slname = Common.Common.GetThumbImg(path, newFileName, fileExt);
  347. if (slname != "")
  348. {
  349. string slkey = DESEncrypt.EncryptDES(path + slname + "||" + fileName);
  350. fl.filesmallurl = urlpre + slkey;
  351. }
  352. }
  353. catch (Exception ex)
  354. {
  355. _logger.LogError("生成缩略图失败,原因:" + ex.ToString());
  356. fl.filesmallurl = urlpre + key;
  357. }
  358. fl.filemd5 = filemd5;
  359. strfiles.Add(fl);
  360. }
  361. return Success("上传成功", strfiles);
  362. }
  363. catch (Exception ex)
  364. {
  365. return Error("上传失败,原因:" + ex.ToString());
  366. }
  367. }
  368. }
  369. }