.gitignore | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
cylsg/EzTencentCloud/Class1.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
cylsg/EzUpFile/Class1.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
cylsg/EzUpFile/EzFileUploadService.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
cylsg/EzUpFile/EzUpFile.csproj | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
cylsg/EzUpFile/IEzFileUploadService.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
cylsg/EzUpFile/UpFileConfig.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
cylsg/EzUpFile/UpFileController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
cylsg/cylsg.Application/LogoInController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
cylsg/cylsg.Application/applicationsettings.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
cylsg/cylsg.Web.Core/cylsg.Web.Core.csproj | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
cylsg/cylsg.Web.Entry/appsettings.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
.gitignore
@@ -23,3 +23,5 @@ cylsg/EzTencentCloud/bin/ cylsg/EzTencentCloud/obj/ cylsg/EzUpFile/obj/ cylsg/cylsg.services/bin/ cylsg/EzUpFile/bin/ cylsg/EzTencentCloud/Class1.cs
File was deleted cylsg/EzUpFile/Class1.cs
File was deleted cylsg/EzUpFile/EzFileUploadService.cs
New file @@ -0,0 +1,282 @@ using Aliyun.OSS; using Aliyun.OSS.Util; using cylsg.utility; using cylsg.utility.Extend; using Furion; using Furion.DependencyInjection; using Furion.FriendlyException; using Microsoft.AspNetCore.Http; using SqlSugar; using System.Globalization; using System.Security.Policy; namespace EzUpFile { /// <summary> /// 附件服务程序 /// </summary> public class EzFileUploadService : IEzFileUploadService, IScoped { private readonly HttpRequest? _request; private readonly ISqlSugarClient _sqlSugarClient; public EzFileUploadService(IHttpContextAccessor httpContext, ISqlSugarClient sqlSugarClient) { _request = httpContext.HttpContext?.Request ?? null; _sqlSugarClient = sqlSugarClient; } /// <summary> /// 上传附件 /// </summary> /// <returns></returns> public async Task<string> 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; } /// <summary> /// 上传base64 /// </summary> /// <param name="base64"></param> /// <returns></returns> public async Task<string> 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; } /// <summary> /// 删除文件 /// </summary> /// <param name="Path"></param> /// <returns></returns> public async Task<bool> DelFile(string Path) { var ret = await DelFileForAliYunOSS(Path); return ret; } #region 阿里云上传方法(File) /// <summary> /// 阿里云上传方法(File) /// </summary> /// <param name="options"></param> /// <param name="fileExt"></param> /// <param name="file"></param> /// <returns></returns> public async Task<string> 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) /// <summary> /// 阿里云上传方法(Base64) /// </summary> /// <param name="options"></param> /// <param name="memStream"></param> /// <returns></returns> public async Task<string> 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 删除文件 /// <summary> /// 阿里云删除 /// </summary> /// <param name="options"></param> /// <param name="fileUrl">带xxx.xx的链接地址</param> /// <returns></returns> public async Task<bool> 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; } #endregion } } cylsg/EzUpFile/EzUpFile.csproj
@@ -6,4 +6,19 @@ <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\cylsg.Core\cylsg.Core.csproj" /> <ProjectReference Include="..\cylsg.utility\cylsg.utility.csproj" /> </ItemGroup> <ItemGroup> <None Update="UpFileConfig.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> </Project> cylsg/EzUpFile/IEzFileUploadService.cs
New file @@ -0,0 +1,30 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EzUpFile { public interface IEzFileUploadService { /// <summary> /// 上传base64 /// </summary> /// <param name="base64"></param> /// <returns></returns> Task<string> UploadFilesFByBase64(string base64); /// <summary> /// 上传文件 /// </summary> /// <returns></returns> Task<string> UploadFiles(); /// <summary> /// 删除文件 /// </summary> /// <param name="Path"></param> /// <returns></returns> Task<bool> DelFile(string Path); } } cylsg/EzUpFile/UpFileConfig.json
New file @@ -0,0 +1,29 @@ { "FileUploadOptions": { "AliOSSBucketName": "appimchat", "SavePath": "cylsg/", "AliOSSEndpoint": "oss-accelerate.aliyuncs.com", "AliOSSAccessKeyID": "LTAI5tNYGwTd3swLhC8H2XYV", "AliOSSAccessKeySecret": "TyfkpYbXRUCh1K8LLtUyxY3ZcFCy1A", "AliOSSSaveBaseUrl": "https://appimchat.oss-cn-chengdu.aliyuncs.com/" }, "[openapi:FileUpdata]": { "Title": "文件上传", "Order": 0, "Description": "文件上传API", "Version": "1.0.0", "TermsOfService": "", "Contact": { "Name": "文件上传川印临时工", "Url": "", "Email": "liaoXuJun@QQ.Com" }, "License": { "Name": "MIT", "Url": "" } } } cylsg/EzUpFile/UpFileController.cs
New file @@ -0,0 +1,80 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EzUpFile { /// <summary> /// 文件上传下载 /// </summary> [DynamicApiController] [ApiDescriptionSettings("FileUpdata@0")] public class UpFileController { /// <summary> /// 上传附件 /// </summary> /// <param name="fileUploadService"></param> /// <returns></returns> [HttpPost] public async Task<string> UpdateFile([FromServices] IEzFileUploadService fileUploadService, IFormFile file) { return await fileUploadService.UploadFiles(); } /// <summary> /// 获取到客户端的IPv4 /// </summary> /// <param name="httpContextAccessor"></param> /// <returns></returns> [HttpGet] public string GetIp4([FromServices] IHttpContextAccessor httpContextAccessor) { var httpc = httpContextAccessor.HttpContext; var ipv4 = httpc.GetRemoteIpAddressToIPv4(); return ipv4; } /// <summary> /// 上传附件 /// </summary> /// <param name="fileUploadService"></param> /// <param name="Param"></param> /// <returns></returns> [HttpPost] public async Task<string> UpdateFileBase64([FromServices] IEzFileUploadService fileUploadService, UpDataFileData Param) { return await fileUploadService.UploadFilesFByBase64(Param.FileBase64); } [HttpPost] public async Task<bool> DelFile([FromServices] IEzFileUploadService fileUploadService, DelFileData Param) { return await fileUploadService.DelFile(Param.FilePath); } } /// <summary> /// 上传数据 /// </summary> public class UpDataFileData { /// <summary> /// 数据base64 /// </summary> public string FileBase64 { get; set; } } /// <summary> /// 上传数据 /// </summary> public class DelFileData { /// <summary> /// 数据base64 /// </summary> public string FilePath { get; set; } } } cylsg/cylsg.Application/LogoInController.cs
@@ -15,6 +15,7 @@ /// 登录 /// </summary> [DynamicApiController] [ApiDescriptionSettings("Default@1")] public class LogoIn { private readonly IWechatService _wechatService; @@ -47,7 +48,7 @@ } var jwt = new EzJwtModel() { ITCode = user.ItCode, //ITCode = user.ItCode, 不在明文中使用Itcode NickName = user.Nickname, UserID = user.Id, cylsg/cylsg.Application/applicationsettings.json
@@ -1,14 +1,14 @@ { "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", "SpecificationDocumentSettings": { "DocumentTitle": "Furion | 川印零时工", "DocumentTitle": " 川印临时工", "GroupOpenApiInfos": [ { "Group": "Default", "Title": "川印零时工", "Description": "川印零时工", "Title": "川印临时工", "Description": "川印临时工", "Version": "1.0.0", "Order": 10, "Contact": { "Name": "", cylsg/cylsg.Web.Core/cylsg.Web.Core.csproj
@@ -16,6 +16,7 @@ <ItemGroup> <ProjectReference Include="..\cylsg.Application\cylsg.Application.csproj" /> <ProjectReference Include="..\cylsg.Authorization\cylsg.Authorization.csproj" /> <ProjectReference Include="..\EzUpFile\EzUpFile.csproj" /> </ItemGroup> </Project> cylsg/cylsg.Web.Entry/appsettings.json
@@ -24,6 +24,7 @@ ], "DynamicApiControllerSettings": { "KeepName": true, "KeepVerb": true,