diff --git a/CoreCms.Net.Utility/Helper/CommonHelper.cs b/CoreCms.Net.Utility/Helper/CommonHelper.cs index 0f93408f..370117c5 100644 --- a/CoreCms.Net.Utility/Helper/CommonHelper.cs +++ b/CoreCms.Net.Utility/Helper/CommonHelper.cs @@ -191,7 +191,7 @@ namespace CoreCms.Net.Utility.Helper } // 返回加密的字符串 return sb.ToString(); - } + } #endregion #region 获取32位md5加密 @@ -678,8 +678,60 @@ namespace CoreCms.Net.Utility.Helper } return sub.ToString(); - } + } #endregion + /// + /// 精确计算base64字符串文件大小(单位:B) + /// param base64String + /// return double 字节大小 + /// + /// + /// + public static double Base64FileSize(String base64String) + { + //检测是否含有base64,文件头) + if (base64String.LastIndexOf(",", StringComparison.Ordinal) > -1) + { + base64String = base64String[(base64String.LastIndexOf(",", StringComparison.Ordinal) + 1)..]; + } + //获取base64字符串长度(不含data:audio/wav;base64,文件头) + var size0 = base64String.Length; + if (size0 <= 10) return size0 - ((double)size0 / 8) * 2; + //获取字符串的尾巴的最后10个字符,用于判断尾巴是否有等号,正常生成的base64文件'等号'不会超过4个 + var tail = base64String[(size0 - 10)..]; + //找到等号,把等号也去掉,(等号其实是空的意思,不能算在文件大小里面) + int equalIndex = tail.IndexOf("=", StringComparison.Ordinal); + if (equalIndex > 0) + { + size0 = size0 - (10 - equalIndex); + } + //计算后得到的文件流大小,单位为字节 + return size0 - ((double)size0 / 8) * 2; + } + + /// + /// 判断文件大小 + /// + /// + /// + /// + /// + public static bool CheckBase64Size(string base64, int size, string unit = "M") + { + // 上传文件的大小, 单位为字节. + var len = Base64FileSize(base64); + // 准备接收换算后文件大小的容器 + double fileSize = unit.ToUpperInvariant() switch + { + "B" => len, + "K" => (double)len / 1024, + "M" => (double)len / 1048576, + "G" => (double)len / 1073741824, + _ => 0 + }; + // 如果上传文件大于限定的容量 + return !(fileSize > size); + } } } diff --git a/CoreCms.Net.Web.Admin/Controllers/Com/ToolsController.cs b/CoreCms.Net.Web.Admin/Controllers/Com/ToolsController.cs index 66067f9f..489e90d9 100644 --- a/CoreCms.Net.Web.Admin/Controllers/Com/ToolsController.cs +++ b/CoreCms.Net.Web.Admin/Controllers/Com/ToolsController.cs @@ -447,6 +447,13 @@ namespace CoreCms.Net.Web.Admin.Controllers return jm; } + //检查上传大小 + if (!CommonHelper.CheckBase64Size(entity.base64, filesStorageOptions.MaxSize)) + { + jm.msg = "上传文件大小超过限制,最大允许上传" + filesStorageOptions.MaxSize + "M"; + return jm; + } + entity.base64 = entity.base64.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "").Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "");//将base64头部信息替换 byte[] bytes = Convert.FromBase64String(entity.base64); MemoryStream memStream = new MemoryStream(bytes); @@ -1953,5 +1960,86 @@ namespace CoreCms.Net.Web.Admin.Controllers } #endregion + + #region (微信小程序)新增临时素材==================================================== + + /// + /// (微信小程序)新增临时素材 + /// + /// + [HttpPost] + public async Task New_Temporary_Materials_UploadImg() + { + var jm = new AdminUiCallBack(); + + var filesStorageOptions = await _coreCmsSettingServices.GetFilesStorageOptions(); + //初始化上传参数 + var maxSize = 1024 * 1024 * filesStorageOptions.MaxSize; //上传大小5M + + var file = Request.Form.Files["file"]; + if (file == null) + { + jm.msg = "请选择文件"; + return jm; + } + var fileName = file.FileName; + var fileExt = Path.GetExtension(fileName).ToLowerInvariant(); + + //检查大小 + if (file.Length > maxSize) + { + jm.msg = "上传文件大小超过限制,最大允许上传" + filesStorageOptions.MaxSize + "M"; + return jm; + } + + //检查文件扩展名 + if (string.IsNullOrEmpty(fileExt) || Array.IndexOf(filesStorageOptions.FileTypes.Split(','), fileExt.Substring(1).ToLower()) == -1) + { + jm.msg = "上传文件扩展名是不允许的扩展名,请上传后缀名为:" + filesStorageOptions.FileTypes; + return jm; + } + + byte[] bytes; + await using (var ms = new MemoryStream()) + { + await file.CopyToAsync(ms); + bytes = ms.ToArray(); + } + + var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken(); + var client = _weChatApiHttpClientFactory.CreateWxOpenClient(); + var request = new CgibinMediaUploadRequest + { + AccessToken = accessToken, + FileBytes = bytes, + FileContentType = file.ContentType, + FileName = file.FileName, + Type = "image" + }; + + var response = await client.ExecuteCgibinMediaUploadAsync(request); + if (response.IsSuccessful()) + { + jm.code = 0; + jm.msg = "上传成功!"; + jm.data = new + { + response.CreateTimestamp, + response.MediaId, + response.Type + }; + } + else + { + jm.code = 1; + jm.msg = response.ErrorMessage; + } + jm.otherData = response; + + return jm; + } + + #endregion + } } \ No newline at end of file