using Aliyun.OSS;
using Aliyun.OSS.Util;
using cylsg.utility;
using cylsg.utility.Extend;
using EzTencentCloud;
using Furion;
using Furion.DependencyInjection;
using Furion.FriendlyException;
using Microsoft.AspNetCore.Http;
using SqlSugar;
using System.Drawing;
using System.Globalization;
using System.Security.Policy;
using TencentCloud.Ocr.V20181119.Models;
namespace EzUpFile
{
///
/// 附件服务程序
///
public class EzFileUploadService : IEzFileUploadService, IScoped
{
private readonly HttpRequest? _request;
private readonly ISqlSugarClient _sqlSugarClient;
private readonly ITencentCloudService _tcs;
public EzFileUploadService(IHttpContextAccessor httpContext, ISqlSugarClient sqlSugarClient,ITencentCloudService tencentCloudService)
{
_request = httpContext.HttpContext?.Request ?? null;
_sqlSugarClient = sqlSugarClient;
_tcs= tencentCloudService;
}
///
/// 上传附件
///
///
public async Task UploadFiles()
{
var maxSize = 1024 * 1024 * 5; //上传大小5M
var file = _request?.Form?.Files["file"];
if (file == null)
{
throw Oops.Oh("你没有选择文件");
}
var fileName = file.FileName;
var fileExt = Path.GetExtension(fileName).ToLowerInvariant();
//检查大小
if (file.Length > maxSize)
{
throw Oops.Oh("文件大于设置文件");
}
////检查文件扩展名
//if (string.IsNullOrEmpty(fileExt) || Array.IndexOf(op.AttachmentSaveFileExtName?.Split(',') ?? new string[] { "" }, fileExt.Substring(1).ToLower()) == -1)
//{
// throw Oops.Oh("上传文件扩展名是不允许的扩展名,请上传后缀名为:" + op.AttachmentSaveFileExtName);
//}
string url = string.Empty;
url = await UpLoadFileForAliYunOSS(fileExt, file);
return url;
}
///
/// 上传base64
///
///
///
public async Task UploadFilesFByBase64(string base64)
{
if (string.IsNullOrEmpty(base64))
{
throw Oops.Oh("没有内容");
}
//检查上传大小
if (!CommonHelper.CheckBase64Size(base64, 5))
{
throw Oops.Oh("上传文件大小超过限制,最大允许上传" + "5" + "M");
}
base64 = 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(base64);
MemoryStream memStream = new MemoryStream(bytes);
string url = string.Empty;
url = await UpLoadBase64ForAliYunOSS(memStream);
return url;
}
///
/// 删除文件
///
///
///
public async Task DelFile(string Path)
{
var ret = await DelFileForAliYunOSS(Path);
return ret;
}
#region 阿里云上传方法(File)
///
/// 阿里云上传方法(File)
///
///
///
///
///
public async Task UpLoadFileForAliYunOSS(string fileExt, IFormFile file)
{
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
var today = DateTime.Now.ToString("yyyyMMdd");
//上传到阿里云
await using var fileStream = file.OpenReadStream();
var md5 = OssUtils.ComputeContentMd5(fileStream, file.Length);
var filePath = App.Configuration["FileUploadOptions:SavePath"] + today + "/" + newFileName; //云文件保存路径
//初始化阿里云配置--外网Endpoint、访问ID、访问password
var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]);
//将文件md5值赋值给meat头信息,服务器验证文件MD5
var objectMeta = new ObjectMetadata
{
ContentMd5 = md5
};
var task = Task.Run(() =>
//文件上传--空间名、文件保存路径、文件流、meta头信息(文件md5) //返回meta头信息(文件md5)
aliYun.PutObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], filePath, fileStream, objectMeta)
);
//等待完成
try
{
task.Wait();
}
catch (AggregateException ex)
{
throw Oops.Oh(ex.Message);
}
//返回给UEditor的插入编辑器的图片的src
return App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"] + filePath;
}
#endregion
#region 阿里云上传方法(Base64)
///
/// 阿里云上传方法(Base64)
///
///
///
///
public async Task UpLoadBase64ForAliYunOSS(MemoryStream memStream)
{
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + ".jpg";
var today = DateTime.Now.ToString("yyyyMMdd");
// 设置当前流的位置为流的开始
memStream.Seek(0, SeekOrigin.Begin);
await using var fileStream = memStream;
var md5 = OssUtils.ComputeContentMd5(fileStream, memStream.Length);
var filePath = App.Configuration["FileUploadOptions:SavePath"] + today + "/" + newFileName; //云文件保存路径
//初始化阿里云配置--外网Endpoint、访问ID、访问password
var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]);
//将文件md5值赋值给meat头信息,服务器验证文件MD5
var objectMeta = new ObjectMetadata
{
ContentMd5 = md5
};
try
{
//文件上传--空间名、文件保存路径、文件流、meta头信息(文件md5) //返回meta头信息(文件md5)
aliYun.PutObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], filePath, fileStream, objectMeta);
}
catch (AggregateException ex)
{
throw Oops.Oh(ex.Message);
}
//返回给UEditor的插入编辑器的图片的src
return App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"] + filePath;
}
#endregion
#region 删除文件
///
/// 阿里云删除
///
///
/// 带xxx.xx的链接地址
///
public async Task DelFileForAliYunOSS(string fileUrl)
{
//初始化阿里云配置--外网Endpoint、访问ID、访问password
var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]);
try
{
var task = Task.Run(() => aliYun.DeleteObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], (App.Configuration["FileUploadOptions:SavePath"]?.RemoveStartWithStr("/") ?? "") + fileUrl.GetFileName()));
task.Wait();
}
catch (Exception ex)
{
throw Oops.Oh(ex.Message);
}
//返回给UEditor的插入编辑器的图片的src
return true;
}
public async Task<(IDCardOCRResponse,string)> UpIdCord( string PageName = "FRONT")
{
try
{
var maxSize = 1024 * 1024 * 5; //上传大小5M
var FileData = _request?.Form?.Files["file"];
if (FileData.Length > maxSize)
{
throw Oops.Oh(" 上传文件不可超出500K");
}
//处理图形
// var FileData = Request.Form.Files[0];
Image oimage = Image.FromStream(FileData.OpenReadStream());
if (oimage == null)
{
throw Oops.Oh(" 上传失败");
}
MemoryStream ms = new MemoryStream();
if (oimage.Width > 600)
{
if (oimage.Width > oimage.Height)
oimage.GetThumbnailImage(600, 400, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png);
else
oimage.GetThumbnailImage(400, 600, null, IntPtr.Zero).Save(ms, System.Drawing.Imaging.ImageFormat.Png);
}
else
oimage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.Position = 0;
var arr = ms.ToArray();
string img64 = Convert.ToBase64String(arr);
IDCardOCRResponse idcordinfo = null;
string url = "";
try
{
idcordinfo = _tcs.IdCord(img64, PageName == "FRONT");
url = await UploadFilesFByBase64(_tcs.GetIdCordImg());
return ( idcordinfo, url );
}
catch (Exception e)
{
throw Oops.Oh(e.Message);
}
}
catch (Exception e)
{
throw Oops.Oh(e.Message);
}
}
#endregion
}
}