mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2026-06-15 18:27:51 +08:00
【新增】商品图集上传新增批量上传图片,后端通用上传方法新增并发线程限制。
This commit is contained in:
@@ -15,6 +15,7 @@ using System.Drawing;
|
|||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Aliyun.OSS;
|
using Aliyun.OSS;
|
||||||
using Aliyun.OSS.Util;
|
using Aliyun.OSS.Util;
|
||||||
@@ -85,11 +86,10 @@ namespace CoreCms.Net.Web.Admin.Controllers
|
|||||||
private readonly IToolsServices _toolsServices;
|
private readonly IToolsServices _toolsServices;
|
||||||
private readonly ICoreCmsReportsServices _reportsServices;
|
private readonly ICoreCmsReportsServices _reportsServices;
|
||||||
private readonly ICoreCmsGoodsCategoryServices _goodsCategoryServices;
|
private readonly ICoreCmsGoodsCategoryServices _goodsCategoryServices;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private readonly IWeChatApiHttpClientFactory _weChatApiHttpClientFactory;
|
private readonly IWeChatApiHttpClientFactory _weChatApiHttpClientFactory;
|
||||||
|
|
||||||
|
private readonly SemaphoreSlim _semaphore;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构造函数
|
/// 构造函数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -148,6 +148,9 @@ namespace CoreCms.Net.Web.Admin.Controllers
|
|||||||
_toolsServices = toolsServices;
|
_toolsServices = toolsServices;
|
||||||
_reportsServices = reportsServices;
|
_reportsServices = reportsServices;
|
||||||
_goodsCategoryServices = goodsCategoryServices;
|
_goodsCategoryServices = goodsCategoryServices;
|
||||||
|
|
||||||
|
//最多允许2个线程同时访问;
|
||||||
|
_semaphore = new SemaphoreSlim(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region 获取登录用户用户信息(用于面板展示)====================================================
|
#region 获取登录用户用户信息(用于面板展示)====================================================
|
||||||
@@ -370,63 +373,77 @@ namespace CoreCms.Net.Web.Admin.Controllers
|
|||||||
public async Task<AdminUiCallBack> UploadFiles()
|
public async Task<AdminUiCallBack> UploadFiles()
|
||||||
{
|
{
|
||||||
var jm = new AdminUiCallBack();
|
var jm = new AdminUiCallBack();
|
||||||
|
await _semaphore.WaitAsync();
|
||||||
var filesStorageOptions = await _coreCmsSettingServices.GetFilesStorageOptions();
|
try
|
||||||
|
|
||||||
//初始化上传参数
|
|
||||||
var maxSize = 1024 * 1024 * filesStorageOptions.MaxSize; //上传大小5M
|
|
||||||
|
|
||||||
var file = Request.Form.Files["file"];
|
|
||||||
if (file == null)
|
|
||||||
{
|
{
|
||||||
jm.msg = "请选择文件";
|
var filesStorageOptions = await _coreCmsSettingServices.GetFilesStorageOptions();
|
||||||
return jm;
|
|
||||||
|
//初始化上传参数
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
string url = string.Empty;
|
||||||
|
if (filesStorageOptions.StorageType == GlobalEnumVars.FilesStorageOptionsType.LocalStorage.ToString())
|
||||||
|
{
|
||||||
|
url = await _toolsServices.UpLoadFileForLocalStorage(filesStorageOptions, fileExt, file);
|
||||||
|
}
|
||||||
|
else if (filesStorageOptions.StorageType == GlobalEnumVars.FilesStorageOptionsType.AliYunOSS.ToString())
|
||||||
|
{
|
||||||
|
url = await _toolsServices.UpLoadFileForAliYunOSS(filesStorageOptions, fileExt, file);
|
||||||
|
}
|
||||||
|
else if (filesStorageOptions.StorageType == GlobalEnumVars.FilesStorageOptionsType.QCloudOSS.ToString())
|
||||||
|
{
|
||||||
|
url = await _toolsServices.UpLoadFileForQCloudOSS(filesStorageOptions, fileExt, file);
|
||||||
|
}
|
||||||
|
else if (filesStorageOptions.StorageType == GlobalEnumVars.FilesStorageOptionsType.QiNiuKoDo.ToString())
|
||||||
|
{
|
||||||
|
url = await _toolsServices.UpLoadFileForQiNiuKoDo(filesStorageOptions, fileExt, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
var bl = !string.IsNullOrEmpty(url);
|
||||||
|
jm.code = bl ? 0 : 1;
|
||||||
|
jm.msg = bl ? "上传成功!" : "上传失败";
|
||||||
|
jm.data = new
|
||||||
|
{
|
||||||
|
fileUrl = url,
|
||||||
|
src = url
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
catch (Exception e)
|
||||||
var fileName = file.FileName;
|
|
||||||
var fileExt = Path.GetExtension(fileName).ToLowerInvariant();
|
|
||||||
|
|
||||||
//检查大小
|
|
||||||
if (file.Length > maxSize)
|
|
||||||
{
|
{
|
||||||
jm.msg = "上传文件大小超过限制,最大允许上传" + filesStorageOptions.MaxSize + "M";
|
jm.code = 1;
|
||||||
return jm;
|
jm.msg = "数据异常";
|
||||||
|
jm.data = e;
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
//检查文件扩展名
|
|
||||||
if (string.IsNullOrEmpty(fileExt) || Array.IndexOf(filesStorageOptions.FileTypes.Split(','), fileExt.Substring(1).ToLower()) == -1)
|
|
||||||
{
|
{
|
||||||
jm.msg = "上传文件扩展名是不允许的扩展名,请上传后缀名为:" + filesStorageOptions.FileTypes;
|
_semaphore.Release(); // 释放访问
|
||||||
return jm;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string url = string.Empty;
|
|
||||||
if (filesStorageOptions.StorageType == GlobalEnumVars.FilesStorageOptionsType.LocalStorage.ToString())
|
|
||||||
{
|
|
||||||
url = await _toolsServices.UpLoadFileForLocalStorage(filesStorageOptions, fileExt, file);
|
|
||||||
}
|
|
||||||
else if (filesStorageOptions.StorageType == GlobalEnumVars.FilesStorageOptionsType.AliYunOSS.ToString())
|
|
||||||
{
|
|
||||||
url = await _toolsServices.UpLoadFileForAliYunOSS(filesStorageOptions, fileExt, file);
|
|
||||||
}
|
|
||||||
else if (filesStorageOptions.StorageType == GlobalEnumVars.FilesStorageOptionsType.QCloudOSS.ToString())
|
|
||||||
{
|
|
||||||
url = await _toolsServices.UpLoadFileForQCloudOSS(filesStorageOptions, fileExt, file);
|
|
||||||
}
|
|
||||||
else if (filesStorageOptions.StorageType == GlobalEnumVars.FilesStorageOptionsType.QiNiuKoDo.ToString())
|
|
||||||
{
|
|
||||||
url = await _toolsServices.UpLoadFileForQiNiuKoDo(filesStorageOptions, fileExt, file);
|
|
||||||
}
|
|
||||||
|
|
||||||
var bl = !string.IsNullOrEmpty(url);
|
|
||||||
jm.code = bl ? 0 : 1;
|
|
||||||
jm.msg = bl ? "上传成功!" : "上传失败";
|
|
||||||
jm.data = new
|
|
||||||
{
|
|
||||||
fileUrl = url,
|
|
||||||
src = url
|
|
||||||
};
|
|
||||||
|
|
||||||
return jm;
|
return jm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -150,10 +150,11 @@
|
|||||||
|
|
||||||
<fieldset class="layui-elem-field layui-field-title site-title"><legend><a name="compress">图集</a></legend></fieldset>
|
<fieldset class="layui-elem-field layui-field-title site-title"><legend><a name="compress">图集</a></legend></fieldset>
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<div class="layui-input-inline layui-inline-4">
|
<div class="layui-input-inline layui-inline-10">
|
||||||
<input type="hidden" name="goods[images]" id="imageIds" class="layui-input" placeholder="请上传缩略图" lay-reqText="请上传缩略图" />
|
<input type="hidden" name="goods[images]" id="imageIds" class="layui-input" placeholder="请上传缩略图" lay-reqText="请上传缩略图" />
|
||||||
<button type="button" class="layui-btn layui-btn-sm" id="upBtnimageIds"><i class="layui-icon"></i>裁剪上传</button>
|
<button type="button" class="layui-btn layui-btn-sm" id="upBtnimageIds"><i class="layui-icon"></i>单图裁剪上传</button>
|
||||||
<button type="button" class="layui-btn layui-btn-sm" id="upBtnimageIdsOriginal"><i class="layui-icon"></i>原图上传</button>
|
<button type="button" class="layui-btn layui-btn-sm" id="upBtnimageIdsOriginal"><i class="layui-icon"></i>单图原图上传</button>
|
||||||
|
<button type="button" class="layui-btn layui-bg-orange layui-btn-sm" id="upBatchBtn"><i class="layui-icon"></i>多图批量上传(未裁剪)</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-form-mid">
|
<div class="layui-form-mid">
|
||||||
图集:[建议数量控制在10张以内]:
|
图集:[建议数量控制在10张以内]:
|
||||||
@@ -625,7 +626,7 @@
|
|||||||
<!--//一键设置SKU图片时自动生成选中的SKU-->
|
<!--//一键设置SKU图片时自动生成选中的SKU-->
|
||||||
<script id="imageSetMoreSku_tpl" type="text/html">
|
<script id="imageSetMoreSku_tpl" type="text/html">
|
||||||
{{# layui.each(d, function(index, item){ }}
|
{{# layui.each(d, function(index, item){ }}
|
||||||
<input type="checkbox" name="skuAttrValue" value="{{item}}" title="{{item}}" lay-filter="skuAttrValue-filter">
|
<input type="checkbox" name="skuAttrValue" value="{{item}}" title="{{item}}" lay-filter="skuAttrValue-filter">
|
||||||
{{# }); }}
|
{{# }); }}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -888,6 +889,54 @@
|
|||||||
form.render();
|
form.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//上传图集图图片
|
||||||
|
upload.render({
|
||||||
|
elem: '#upBatchBtn'
|
||||||
|
, url: '/api/Tools/UploadFiles' //改成您自己的上传接口
|
||||||
|
, multiple: true
|
||||||
|
, accept: 'images'
|
||||||
|
, exts: 'jpg|jpeg|png|gjf|webp|bmp|tif'
|
||||||
|
, drag: true
|
||||||
|
, allDone: function (obj) {
|
||||||
|
//var txt = "共选择了 【" + obj.total + "】 张图片,其中,上传成功 【" + obj.successful + "】 张,失败 <span style='color:red'>【" + obj.aborted + "】 </span>张";
|
||||||
|
//$("#tipTxt").html(txt);
|
||||||
|
}
|
||||||
|
, before: function (obj) {
|
||||||
|
//预读本地文件示例,不支持ie8
|
||||||
|
obj.preview(function (index, file, result) {
|
||||||
|
$('#upload-more-list').append('<img src="' + result + '" alt="' + file.name + '" class="layui-upload-img">')
|
||||||
|
});
|
||||||
|
}
|
||||||
|
, done: function (res) {
|
||||||
|
var loadIndex = layer.load(2);
|
||||||
|
//如果上传失败
|
||||||
|
if (res.code > 0) {
|
||||||
|
return layer.msg('上传失败');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var url = res.data.src;//缩略图地址
|
||||||
|
var url2 = res.data.fileUrl;//原始图地址
|
||||||
|
|
||||||
|
imgs.push(res.data.src);
|
||||||
|
$('#imageIds').val(imgs);
|
||||||
|
var getTpl = image_tpl.innerHTML, view = document.getElementById('upload-more-list');
|
||||||
|
laytpl(getTpl).render(imgs, function (html) {
|
||||||
|
view.innerHTML = html;
|
||||||
|
});
|
||||||
|
layer.msg(res.msg);
|
||||||
|
layer.close(loadIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
, error: function () {
|
||||||
|
//演示失败状态,并实现重传
|
||||||
|
var demoText = $('#demoText');
|
||||||
|
demoText.html('<span style="color: #FF5722;">上传失败</span><a class= "layui-btn layui-btn-xs demo-reload" > 重试</a > ');
|
||||||
|
demoText.find('.demo-reload').on('click', function () {
|
||||||
|
uploadInst.upload();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
upload.render({
|
upload.render({
|
||||||
elem: '#upBtnimageIdsOriginal'
|
elem: '#upBtnimageIdsOriginal'
|
||||||
, url: layui.setter.apiUrl + 'Api/Tools/UploadFiles'
|
, url: layui.setter.apiUrl + 'Api/Tools/UploadFiles'
|
||||||
|
|||||||
@@ -145,10 +145,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<fieldset class="layui-elem-field layui-field-title site-title"><legend><a name="compress">图集</a></legend></fieldset>
|
<fieldset class="layui-elem-field layui-field-title site-title"><legend><a name="compress">图集</a></legend></fieldset>
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<div class="layui-input-inline layui-inline-4">
|
<div class="layui-input-inline layui-inline-10">
|
||||||
<input type="hidden" name="goods[images]" id="imageIds" value="{{d.data.model.images }}" class="layui-input" placeholder="请上传缩略图" lay-reqText="请上传缩略图" />
|
<input type="hidden" name="goods[images]" id="imageIds" value="{{d.data.model.images }}" class="layui-input" placeholder="请上传缩略图" lay-reqText="请上传缩略图" />
|
||||||
<button type="button" class="layui-btn layui-btn-sm" id="upBtnimageIds"><i class="layui-icon"></i>裁剪上传</button>
|
<button type="button" class="layui-btn layui-btn-sm" id="upBtnimageIds"><i class="layui-icon"></i>单图裁剪上传</button>
|
||||||
<button type="button" class="layui-btn layui-btn-sm" id="upBtnimageIdsOriginal"><i class="layui-icon"></i>原图上传</button>
|
<button type="button" class="layui-btn layui-btn-sm" id="upBtnimageIdsOriginal"><i class="layui-icon"></i>单图原图上传</button>
|
||||||
|
<button type="button" class="layui-btn layui-bg-orange layui-btn-sm" id="upBatchBtn"><i class="layui-icon"></i>多图批量上传(未裁剪)</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-form-mid">
|
<div class="layui-form-mid">
|
||||||
图集:[建议数量控制在10张以内]:
|
图集:[建议数量控制在10张以内]:
|
||||||
@@ -970,6 +971,54 @@
|
|||||||
form.render();
|
form.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//上传图集图图片
|
||||||
|
upload.render({
|
||||||
|
elem: '#upBatchBtn'
|
||||||
|
, url: '/api/Tools/UploadFiles' //改成您自己的上传接口
|
||||||
|
, multiple: true
|
||||||
|
, accept: 'images'
|
||||||
|
, exts: 'jpg|jpeg|png|gjf|webp|bmp|tif'
|
||||||
|
, drag: true
|
||||||
|
, allDone: function (obj) {
|
||||||
|
//var txt = "共选择了 【" + obj.total + "】 张图片,其中,上传成功 【" + obj.successful + "】 张,失败 <span style='color:red'>【" + obj.aborted + "】 </span>张";
|
||||||
|
//$("#tipTxt").html(txt);
|
||||||
|
}
|
||||||
|
, before: function (obj) {
|
||||||
|
//预读本地文件示例,不支持ie8
|
||||||
|
obj.preview(function (index, file, result) {
|
||||||
|
$('#upload-more-list').append('<img src="' + result + '" alt="' + file.name + '" class="layui-upload-img">')
|
||||||
|
});
|
||||||
|
}
|
||||||
|
, done: function (res) {
|
||||||
|
var loadIndex = layer.load(2);
|
||||||
|
//如果上传失败
|
||||||
|
if (res.code > 0) {
|
||||||
|
return layer.msg('上传失败');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var url = res.data.src;//缩略图地址
|
||||||
|
var url2 = res.data.fileUrl;//原始图地址
|
||||||
|
|
||||||
|
imgs.push(res.data.src);
|
||||||
|
$('#imageIds').val(imgs);
|
||||||
|
var getTpl = image_tpl.innerHTML, view = document.getElementById('upload-more-list');
|
||||||
|
laytpl(getTpl).render(imgs, function (html) {
|
||||||
|
view.innerHTML = html;
|
||||||
|
});
|
||||||
|
layer.msg(res.msg);
|
||||||
|
layer.close(loadIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
, error: function () {
|
||||||
|
//演示失败状态,并实现重传
|
||||||
|
var demoText = $('#demoText');
|
||||||
|
demoText.html('<span style="color: #FF5722;">上传失败</span><a class= "layui-btn layui-btn-xs demo-reload" > 重试</a > ');
|
||||||
|
demoText.find('.demo-reload').on('click', function () {
|
||||||
|
uploadInst.upload();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
upload.render({
|
upload.render({
|
||||||
elem: '#upBtnimageIdsOriginal'
|
elem: '#upBtnimageIdsOriginal'
|
||||||
, url: layui.setter.apiUrl + 'Api/Tools/UploadFiles'
|
, url: layui.setter.apiUrl + 'Api/Tools/UploadFiles'
|
||||||
|
|||||||
Reference in New Issue
Block a user