/***********************************************************************
* Project: baifenBinfa
* ProjectName: 百分兵法管理系统
* Web: http://chuanyin.com
* Author:
* Email:
* CreateTime: 202403/02
* Description: 暂无
***********************************************************************/
using System;
using System.Globalization;
using System.IO;
using System.Threading.Tasks;
using Aliyun.OSS;
using Aliyun.OSS.Util;
using CoreCms.Net.Caching.Manual;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Options;
using CoreCms.Net.Model.ViewModels.UI;
using COSXML;
using COSXML.Auth;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.FileProviders;
using Qiniu.Storage;
using Qiniu.Util;
using SixLabors.ImageSharp;
using ToolGood.Words;
namespace CoreCms.Net.Services
{
///
/// 标签表 接口实现
///
public class ToolsServices : IToolsServices
{
private readonly IWebHostEnvironment _hostEnvironment;
private readonly IWebHostEnvironment _webHostEnvironment;
public ToolsServices(IWebHostEnvironment hostEnvironment, IWebHostEnvironment webHostEnvironment)
{
_hostEnvironment = hostEnvironment;
_webHostEnvironment = webHostEnvironment;
}
///
/// 查询是否存在违规内容并进行替换
///
///
public async Task IllegalWordsReplace(string oldString, char symbol = '*')
{
var cache = ManualDataCache.Instance.Get(ToolsVars.IllegalWordsCahceName);
if (string.IsNullOrEmpty(cache))
{
IFileProvider fileProvider = this._hostEnvironment.ContentRootFileProvider;
IFileInfo fileInfo = fileProvider.GetFileInfo("illegalWord/IllegalKeywords.txt");
string fileContent = null;
using (StreamReader readSteam = new StreamReader(fileInfo.CreateReadStream()))
{
fileContent = await readSteam.ReadToEndAsync();
}
cache = fileContent;
ManualDataCache.Instance.Set(ToolsVars.IllegalWordsCahceName, cache);
}
//WordsMatch wordsSearch = new WordsMatch();
//wordsSearch.SetKeywords(cache.Split('|', StringSplitOptions.RemoveEmptyEntries));
StringSearch wordsSearch = new StringSearch();
wordsSearch.SetKeywords(cache.Split('|', StringSplitOptions.RemoveEmptyEntries));
var t = wordsSearch.Replace(oldString, symbol);
return t;
}
///
/// 查询是否存在违规内容
///
///
public async Task IllegalWordsContainsAny(string oldString)
{
var cache = ManualDataCache.Instance.Get(ToolsVars.IllegalWordsCahceName);
if (string.IsNullOrEmpty(cache))
{
IFileProvider fileProvider = this._hostEnvironment.ContentRootFileProvider;
IFileInfo fileInfo = fileProvider.GetFileInfo("illegalWord/IllegalKeywords.txt");
string fileContent = null;
using (StreamReader readSteam = new StreamReader(fileInfo.CreateReadStream()))
{
fileContent = await readSteam.ReadToEndAsync();
}
cache = fileContent;
ManualDataCache.Instance.Set(ToolsVars.IllegalWordsCahceName, cache);
}
StringSearch wordsSearch = new StringSearch();
wordsSearch.SetKeywords(cache.Split('|', StringSplitOptions.RemoveEmptyEntries));
var bl = wordsSearch.ContainsAny(oldString);
return bl;
}
#region 本地上传方法(File)
///
/// 本地上传方法(File)
///
///
///
///
///
///
public async Task UpLoadFileForLocalStorage(FilesStorageOptions options, string fileExt, IFormFile file, int filesStorageLocation = (int)GlobalEnumVars.FilesStorageLocation.Admin)
{
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
var today = DateTime.Now.ToString("yyyyMMdd");
var saveUrl = options.Path + today + "/";
var dirPath = _webHostEnvironment.WebRootPath + saveUrl;
if (!Directory.Exists(dirPath)) Directory.CreateDirectory(dirPath);
var filePath = dirPath + newFileName;
var fileUrl = saveUrl + newFileName;
string bucketBindDomain = string.Empty;
if (filesStorageLocation == (int)GlobalEnumVars.FilesStorageLocation.Admin)
{
//bucketBindDomain = AppSettingsConstVars.AppConfigAppUrl;
bucketBindDomain = !string.IsNullOrEmpty(options.BucketBindUrl) ? options.BucketBindUrl : AppSettingsConstVars.AppConfigAppUrl;
}
else if (filesStorageLocation == (int)GlobalEnumVars.FilesStorageLocation.API)
{
bucketBindDomain = AppSettingsConstVars.AppConfigAppInterFaceUrl;
}
await using (var fs = System.IO.File.Create(filePath))
{
await file.CopyToAsync(fs);
fs.Flush();
}
return bucketBindDomain + fileUrl;
}
#endregion
#region 阿里云上传方法(File)
///
/// 阿里云上传方法(File)
///
///
///
///
///
public async Task UpLoadFileForAliYunOSS(FilesStorageOptions options, string fileExt, IFormFile file)
{
var jm = new AdminUiCallBack();
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 = options.Path + today + "/" + newFileName; //云文件保存路径
//初始化阿里云配置--外网Endpoint、访问ID、访问password
var aliYun = new OssClient(options.Endpoint, options.AccessKeyId, options.AccessKeySecret);
//将文件md5值赋值给meat头信息,服务器验证文件MD5
var objectMeta = new ObjectMetadata
{
ContentMd5 = md5
};
//文件上传--空间名、文件保存路径、文件流、meta头信息(文件md5) //返回meta头信息(文件md5)
aliYun.PutObject(options.BucketName, filePath, fileStream, objectMeta);
//返回给UEditor的插入编辑器的图片的src
return options.BucketBindUrl + filePath;
}
#endregion
#region 腾讯云存储上传方法(File)
///
/// 腾讯云存储上传方法(File)
///
///
///
///
///
public async Task UpLoadFileForQCloudOSS(FilesStorageOptions options, string fileExt, IFormFile file)
{
var jm = new AdminUiCallBack();
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
var today = DateTime.Now.ToString("yyyyMMdd");
var filePath = options.Path + today + "/" + newFileName; //云文件保存路径
//上传到腾讯云OSS
//初始化 CosXmlConfig
string appid = options.AccountId;//设置腾讯云账户的账户标识 APPID
string region = options.CosRegion; //设置一个默认的存储桶地域
CosXmlConfig config = new CosXmlConfig.Builder()
//.SetAppid(appid)
.IsHttps(true) //设置默认 HTTPS 请求
.SetRegion(region) //设置一个默认的存储桶地域
.SetDebugLog(true) //显示日志
.Build(); //创建 CosXmlConfig 对象
long durationSecond = 600; //每次请求签名有效时长,单位为秒
QCloudCredentialProvider qCloudCredentialProvider = new DefaultQCloudCredentialProvider(options.AccessKeyId, options.AccessKeySecret, durationSecond);
byte[] bytes;
await using (var ms = new MemoryStream())
{
await file.CopyToAsync(ms);
bytes = ms.ToArray();
}
var cosXml = new CosXmlServer(config, qCloudCredentialProvider);
COSXML.Model.Object.PutObjectRequest putObjectRequest = new COSXML.Model.Object.PutObjectRequest(options.TencentBucketName, filePath, bytes);
cosXml.PutObject(putObjectRequest);
return options.BucketBindUrl + filePath;
}
#endregion
#region 七牛云存储上传(File)
///
/// 七牛云存储上传(File)
///
///
///
///
///
public async Task UpLoadFileForQiNiuKoDo(FilesStorageOptions options, string fileExt, IFormFile file)
{
var jm = new AdminUiCallBack();
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_fffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
Mac mac = new Mac(options.AccessKeyId, options.AccessKeySecret);
byte[] bytes;
await using (var ms = new MemoryStream())
{
await file.CopyToAsync(ms);
bytes = ms.ToArray();
}
// 设置上传策略
PutPolicy putPolicy = new PutPolicy();
// 设置要上传的目标空间
putPolicy.Scope = options.QiNiuBucketName;
// 上传策略的过期时间(单位:秒)
putPolicy.SetExpires(3600);
// 文件上传完毕后,在多少天后自动被删除
//putPolicy.DeleteAfterDays = 1;
// 生成上传token
string token = Qiniu.Util.Auth.CreateUploadToken(mac, putPolicy.ToJsonString());
Config config = new Config();
// 设置 http 或者 https 上传
config.UseHttps = true;
config.UseCdnDomains = true;
config.ChunkSize = ChunkUnit.U512K;
UploadManager um = new UploadManager(config);
var outData = um.UploadData(bytes, newFileName, token, null);
return options.BucketBindUrl + newFileName;
}
#endregion
#region 本地上传方法(Base64)
///
/// 本地上传方法(Base64)
///
///
///
///
///
public string UpLoadBase64ForLocalStorage(FilesStorageOptions options, MemoryStream memStream, int filesStorageLocation = (int)GlobalEnumVars.FilesStorageLocation.Admin)
{
var jm = new AdminUiCallBack();
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + ".jpg";
var today = DateTime.Now.ToString("yyyyMMdd");
byte[] data = new byte[memStream.Length];
memStream.Seek(0, SeekOrigin.Begin);
memStream.Read(data, 0, Convert.ToInt32(memStream.Length));
SixLabors.ImageSharp.Image image = SixLabors.ImageSharp.Image.Load(new MemoryStream(data));
var saveUrl = options.Path + today + "/";
var dirPath = _webHostEnvironment.WebRootPath + saveUrl;
string bucketBindDomain = string.Empty;
if (filesStorageLocation == (int)GlobalEnumVars.FilesStorageLocation.Admin)
{
//bucketBindDomain = AppSettingsConstVars.AppConfigAppUrl;
bucketBindDomain = !string.IsNullOrEmpty(options.BucketBindUrl) ? options.BucketBindUrl : AppSettingsConstVars.AppConfigAppUrl;
;
}
else if (filesStorageLocation == (int)GlobalEnumVars.FilesStorageLocation.API)
{
bucketBindDomain = AppSettingsConstVars.AppConfigAppInterFaceUrl;
}
if (!Directory.Exists(dirPath)) Directory.CreateDirectory(dirPath);
var filePath = dirPath + newFileName;
var fileUrl = saveUrl + newFileName;
//保存到图片
image.SaveAsync(filePath);
return bucketBindDomain + fileUrl;
}
#endregion
#region 阿里云上传方法(Base64)
///
/// 阿里云上传方法(Base64)
///
///
///
///
public async Task UpLoadBase64ForAliYunOSS(FilesStorageOptions options, MemoryStream memStream)
{
var jm = new AdminUiCallBack();
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 = options.Path + today + "/" + newFileName; //云文件保存路径
//初始化阿里云配置--外网Endpoint、访问ID、访问password
var aliyun = new OssClient(options.Endpoint, options.AccessKeyId, options.AccessKeySecret);
//将文件md5值赋值给meat头信息,服务器验证文件MD5
var objectMeta = new ObjectMetadata
{
ContentMd5 = md5
};
//文件上传--空间名、文件保存路径、文件流、meta头信息(文件md5) //返回meta头信息(文件md5)
aliyun.PutObject(options.BucketName, filePath, fileStream, objectMeta);
//返回给UEditor的插入编辑器的图片的src
return options.BucketBindUrl + filePath;
}
#endregion
#region 腾讯云存储上传方法(Base64)
///
/// 腾讯云存储上传方法(Base64)
///
///
///
///
public string UpLoadBase64ForQCloudOSS(FilesStorageOptions options, byte[] bytes)
{
var jm = new AdminUiCallBack();
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + ".jpg";
var today = DateTime.Now.ToString("yyyyMMdd");
//初始化 CosXmlConfig
string appid = options.AccountId;//设置腾讯云账户的账户标识 APPID
string region = options.CosRegion; //设置一个默认的存储桶地域
CosXmlConfig config = new CosXmlConfig.Builder()
//.SetAppid(appid)
.IsHttps(true) //设置默认 HTTPS 请求
.SetRegion(region) //设置一个默认的存储桶地域
.SetDebugLog(true) //显示日志
.Build(); //创建 CosXmlConfig 对象
long durationSecond = 600; //每次请求签名有效时长,单位为秒
QCloudCredentialProvider qCloudCredentialProvider = new DefaultQCloudCredentialProvider(options.AccessKeyId, options.AccessKeySecret, durationSecond);
var cosXml = new CosXmlServer(config, qCloudCredentialProvider);
var filePath = options.Path + today + "/" + newFileName; //云文件保存路径
COSXML.Model.Object.PutObjectRequest putObjectRequest = new COSXML.Model.Object.PutObjectRequest(options.TencentBucketName, filePath, bytes);
cosXml.PutObject(putObjectRequest);
return options.BucketBindUrl + filePath;
}
#endregion
#region 牛云上传方法(Base64)
///
/// 七牛云上传方法(Base64)
///
///
///
///
public string UpLoadBase64ForQiNiuKoDo(FilesStorageOptions options, byte[] bytes)
{
var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_fffff", DateTimeFormatInfo.InvariantInfo) + ".jpg";
Mac mac = new Mac(options.AccessKeyId, options.AccessKeySecret);
// 设置上传策略
PutPolicy putPolicy = new PutPolicy();
// 设置要上传的目标空间
putPolicy.Scope = options.QiNiuBucketName;
// 上传策略的过期时间(单位:秒)
putPolicy.SetExpires(3600);
// 文件上传完毕后,在多少天后自动被删除
//putPolicy.DeleteAfterDays = 1;
// 生成上传token
string token = Qiniu.Util.Auth.CreateUploadToken(mac, putPolicy.ToJsonString());
Config config = new Config();
// 设置 http 或者 https 上传
config.UseHttps = true;
config.UseCdnDomains = true;
config.ChunkSize = ChunkUnit.U512K;
UploadManager um = new UploadManager(config);
var outData = um.UploadData(bytes, newFileName, token, null);
return options.BucketBindUrl + newFileName;
}
#endregion
}
}