mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2025-12-06 19:13:26 +08:00
【新增】图片的【裁剪上传】模式增加上传文件流大小验证机制。限制用户裁剪过大图片。
This commit is contained in:
@@ -681,5 +681,57 @@ namespace CoreCms.Net.Utility.Helper
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 精确计算base64字符串文件大小(单位:B)
|
||||||
|
/// param base64String
|
||||||
|
/// return double 字节大小
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="base64String"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 判断文件大小
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="base64"></param>
|
||||||
|
/// <param name="size"></param>
|
||||||
|
/// <param name="unit"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -447,6 +447,13 @@ namespace CoreCms.Net.Web.Admin.Controllers
|
|||||||
return jm;
|
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头部信息替换
|
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);
|
byte[] bytes = Convert.FromBase64String(entity.base64);
|
||||||
MemoryStream memStream = new MemoryStream(bytes);
|
MemoryStream memStream = new MemoryStream(bytes);
|
||||||
@@ -1953,5 +1960,86 @@ namespace CoreCms.Net.Web.Admin.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region (微信小程序)新增临时素材====================================================
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// (微信小程序)新增临时素材
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<AdminUiCallBack> 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
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user