using CZFW.CMS.Admin; using CZFW.Core; using CZFW.Framework.Model.ViewModel; using CZFW.MDB.Util; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace CZFW.CMS.Builder.Controllers { public class AttachmentController:AdminControllerBase { ILogger _logger; public AttachmentController(ILogger logger) { _logger = logger; } [HttpPost] public ResultModel UploadImages() { if (!Request.ContentType.Contains("form-data")) { var result = new ResultModel() { Success = false, Code = "", Message = "表单中未找到文件" }; return result; } //如果上传文件不是form-data类型抛出异常 var urls = new List(); var model = new ResultModel(); var filePathRoot = ConfigHelper.GetValue("ResourcePathRoot"); try { foreach (var f in Request.Form.Files) { var fileName = $"{CZFW.Core.Utility.GetUnixTimeTick()}" + f.FileName; if (!CheckFileExtension(f.FileName, CheckFileTypeEnum.image)) return Result(false, "文件类型错误,请上传jpg,png,gif类型的图片文件"); var mimeType = f.Headers["Content-Type"]; if (!mimeType.ToString().Contains("image")) { return new ResultModel("文件类型错误!请上传jpg,png,gif类型的图片文件。"); } string date = DateTime.Now.ToString(); var destPath = Path.Combine(filePathRoot, "TempFiles", fileName);// filePathRoot + "\\TempFiles\\" + fileName; var ff = new FileInfo(destPath); using (var tt = ff.OpenWrite()) { f.CopyTo(tt); tt.Flush(); tt.Close(); } var destPath2 = Path.Combine(filePathRoot, Site.SiteName, "images", fileName);// $"{filePathRoot}\\{Site.SiteName}\\images\\{fileName}"; FileInfo flocal = new FileInfo(destPath); var tp = flocal.CopyTo(destPath2, true); urls.Add($"/{Constants.RESOURCE_FILE_URL_PREFIX}/{Site.SiteName}/images/{fileName}"); } model.Data = urls; model.Success = true; } catch (Exception err) { model.Success = false; model.Message = err.Message; } return model; } [HttpPost] [RequestSizeLimit(500_000_000)] //最大100m左右 public ResultModel UploadDocs() { if (!Request.ContentType.Contains("form-data")) { var result = new ResultModel() { Success = false, Code = "", Message = "表单中未找到文件" }; return result; } //如果上传文件不是form-data类型抛出异常 var urls = new List(); var model = new ResultModel(); var filePathRoot = ConfigHelper.GetValue("ResourcePathRoot"); try { foreach (var f in Request.Form.Files) { var fileName = $"{CZFW.Core.Utility.GetUnixTimeTick()}" + f.FileName; if (!CheckFileExtension(f.FileName, CheckFileTypeEnum.document)) return Result(false, "文件类型错误,请上传word,excel,ppt,pdf,zip或者rar类型的文档"); var mimeType = f.Headers["Content-Type"]; //if (!mimeType.ToString().Contains("image")) //{ // return new ResultModel("文件类型错误!请上传jpg,png,gif类型的图片文件。"); //} string date = DateTime.Now.ToString(); var destPath = Path.Combine(filePathRoot, "TempFiles" , fileName); var ff = new FileInfo(destPath); using (var tt = ff.OpenWrite()) { f.CopyTo(tt); tt.Flush(); tt.Close(); } var destPath2 = Path.Combine(filePathRoot,Site.SiteName,"docs",fileName); FileInfo flocal = new FileInfo(destPath); var tp = flocal.CopyTo(destPath2, true); urls.Add($"/{Constants.RESOURCE_FILE_URL_PREFIX}/{Site.SiteName}/docs/{fileName}"); } model.Data = urls; model.Success = true; } catch (Exception err) { model.Success = false; model.Message = err.Message; } return model; } [HttpPost] [RequestSizeLimit(500_000_000)] //最大100m左右 public ResultModel UploadAudio() { if (!Request.ContentType.Contains("form-data")) { var result = new ResultModel() { Success = false, Code = "", Message = "表单中未找到文件" }; return result; } //如果上传文件不是form-data类型抛出异常 var urls = new List(); var model = new ResultModel(); var filePathRoot = ConfigHelper.GetValue("ResourcePathRoot"); try { foreach (var f in Request.Form.Files) { var fileName = $"{CZFW.Core.Utility.GetUnixTimeTick()}" + f.FileName; if (!CheckFileExtension(f.FileName, CheckFileTypeEnum.audio)) return Result(false, "文件类型错误,请上传mp3,wav,mid类型的音频文件"); var mimeType = f.Headers["Content-Type"]; if (!mimeType.ToString().Contains("audio")) { return new ResultModel("文件类型错误!请上传mp3,wav,mid类型的音频文件。"); } string date = DateTime.Now.ToString(); var destPath = Path.Combine(filePathRoot, "TempFiles", fileName); var ff = new FileInfo(destPath); using (var tt = ff.OpenWrite()) { f.CopyTo(tt); tt.Flush(); tt.Close(); } var destPath2 = Path.Combine(filePathRoot, Site.SiteName, "audios", fileName); FileInfo flocal = new FileInfo(destPath); var tp = flocal.CopyTo(destPath2, true); urls.Add($"/{Constants.RESOURCE_FILE_URL_PREFIX}/{Site.SiteName}/audios/{fileName}"); } model.Data = urls; model.Success = true; } catch (Exception err) { model.Success = false; model.Message = err.Message; } return model; } [HttpPost] [RequestSizeLimit(500_000_000)] //最大100m左右 public ResultModel UploadVideo() { if (!Request.ContentType.Contains("form-data")) { var result = new ResultModel() { Success = false, Code = "", Message = "表单中未找到文件" }; return result; } //如果上传文件不是form-data类型抛出异常 var urls = new List(); var model = new ResultModel(); var filePathRoot = ConfigHelper.GetValue("ResourcePathRoot"); try { foreach (var f in Request.Form.Files) { var fileName = $"{CZFW.Core.Utility.GetUnixTimeTick()}" + f.FileName; if (!CheckFileExtension(f.FileName, CheckFileTypeEnum.video)) return Result(false, "文件类型错误,请上传mp4, avi类型的视频文件"); var mimeType = f.Headers["Content-Type"]; if (!mimeType.ToString().Contains("video")) { return new ResultModel("文件类型错误!请上传mp4, avi类型的视频文件。"); } string date = DateTime.Now.ToString(); var destPath = Path.Combine(filePathRoot, "TempFiles", fileName); var ff = new FileInfo(destPath); using (var tt = ff.OpenWrite()) { f.CopyTo(tt); tt.Flush(); tt.Close(); } var destPath2 = Path.Combine(filePathRoot, Site.SiteName, "videos", fileName); FileInfo flocal = new FileInfo(destPath); var tp = flocal.CopyTo(destPath2, true); urls.Add($"/{Constants.RESOURCE_FILE_URL_PREFIX}/{Site.SiteName}/videos/{fileName}"); } model.Data = urls; model.Success = true; } catch (Exception err) { model.Success = false; model.Message = err.Message; } return model; } public bool CheckFileExtension(string fileName, CheckFileTypeEnum type) { var parts = fileName.ToLower().Split('.'); if(parts.Length<1) { _logger.LogWarning($"尝试检查文件后缀名异常,文件名:{fileName}"); return false; } var extension = parts[parts.Length - 1]; switch (type) { case CheckFileTypeEnum.image: { var imageExtensions =new string[]{"jpg","png","gif","bmp","tif"}; if (imageExtensions.Contains(extension)) return true; else return false; } case CheckFileTypeEnum.audio: { var audioExtensions = new string[] { "mp3","aud","wav","mid"}; if (audioExtensions.Contains(extension)) return true; else return false; } case CheckFileTypeEnum.video: { var videoExtensions = new string[] { "mp4","avi","mpeg","rmvb","flv"}; if (videoExtensions.Contains(extension)) return true; else return false; } case CheckFileTypeEnum.document: { var docExtensions = new string[] { "doc","docx","pdf","ppt","pptx","xls","xlsx","zip","rar"}; if (docExtensions.Contains(extension)) return true; else return false; } default: return false; } } [HttpPost] public IActionResult Upload(string theme = "default") { if (!Request.ContentType.Contains("form-data")) { var result = new ResultModel() { Success = false, Code = "", Message = "表单中未找到文件" }; var res = new { error = 1, message = result.Message }; return Json(res); } //如果上传文件不是form-data类型抛出异常 var urls = new List(); var model = new ResultModel(); var filePathRoot = ConfigHelper.GetValue("ResourcePathRoot"); try { foreach (var f in Request.Form.Files) { var fileName = $"{CZFW.Core.Utility.GetUnixTimeTick()}" + f.FileName; if ( !(CheckFileExtension(f.FileName, CheckFileTypeEnum.image) || CheckFileExtension(f.FileName, CheckFileTypeEnum.audio) || CheckFileExtension(f.FileName, CheckFileTypeEnum.document) || CheckFileExtension(f.FileName, CheckFileTypeEnum.video)) ) { var res = new { error = 1, message = "文件类型错误" }; return Json(res); } string date = DateTime.Now.ToString(); var destPath = Path.Combine(filePathRoot, "TempFiles", fileName); var ff = new FileInfo(destPath); using (var tt = ff.OpenWrite()) { f.CopyTo(tt); tt.Flush(); tt.Close(); } var destPathRoot = ConfigHelper.GetValue("SiteViewPathRoot"); var destPath2 = Path.Combine(filePathRoot, Site.SiteName, "editor_upload", fileName); FileInfo flocal = new FileInfo(destPath); var tp = flocal.CopyTo(destPath2, true); urls.Add($"/{Constants.RESOURCE_FILE_URL_PREFIX}/{Site.SiteName}/editor_upload/{fileName}"); } model.Data = urls; model.Success = true; } catch (Exception err) { model.Success = false; model.Message = err.Message; } if (model.Success) { var url = (model.Data as List)[0]; var res = new { error = 0, url }; return Json(res); } else { var res = new { error = 1, message = model.Message }; return Json(res); } } } public enum CheckFileTypeEnum { image, audio, video, document } }