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