From f5ff0b0492e2799226234dfd8633877b8f9a81d7 Mon Sep 17 00:00:00 2001
From: 移动系统liao <liaoxujun@qq.com>
Date: 星期四, 15 八月 2024 15:22:53 +0800
Subject: [PATCH] 完成阿里云文件上传APi和服务

---
 cylsg/EzUpFile/EzFileUploadService.cs            |  282 +++++++++++++++++++++++++++++++++++
 cylsg/EzUpFile/EzUpFile.csproj                   |   15 +
 /dev/null                                        |    7 
 .gitignore                                       |    2 
 cylsg/cylsg.Web.Core/cylsg.Web.Core.csproj       |    1 
 cylsg/cylsg.Application/LogoInController.cs      |    3 
 cylsg/cylsg.Application/applicationsettings.json |    8 
 cylsg/cylsg.Web.Entry/appsettings.json           |    1 
 cylsg/EzUpFile/UpFileController.cs               |   80 ++++++++++
 cylsg/EzUpFile/UpFileConfig.json                 |   29 +++
 cylsg/EzUpFile/IEzFileUploadService.cs           |   30 +++
 11 files changed, 446 insertions(+), 12 deletions(-)

diff --git a/.gitignore b/.gitignore
index f80bbf4..c6f6863 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,3 +23,5 @@
 cylsg/EzTencentCloud/bin/
 cylsg/EzTencentCloud/obj/
 cylsg/EzUpFile/obj/
+cylsg/cylsg.services/bin/
+cylsg/EzUpFile/bin/
diff --git a/cylsg/EzTencentCloud/Class1.cs b/cylsg/EzTencentCloud/Class1.cs
deleted file mode 100644
index 5238cf9..0000000
--- a/cylsg/EzTencentCloud/Class1.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-锘縩amespace EzTencentCloud
-{
-    public class Class1
-    {
-
-    }
-}
diff --git a/cylsg/EzUpFile/Class1.cs b/cylsg/EzUpFile/Class1.cs
deleted file mode 100644
index 2d366e9..0000000
--- a/cylsg/EzUpFile/Class1.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-锘縩amespace EzUpFile
-{
-    public class Class1
-    {
-
-    }
-}
diff --git a/cylsg/EzUpFile/EzFileUploadService.cs b/cylsg/EzUpFile/EzFileUploadService.cs
new file mode 100644
index 0000000..a10403d
--- /dev/null
+++ b/cylsg/EzUpFile/EzFileUploadService.cs
@@ -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,", "");//灏哹ase64澶撮儴淇℃伅鏇挎崲
+            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銆佽闂甀D銆佽闂畃assword
+            var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]);
+            //灏嗘枃浠秏d5鍊艰祴鍊肩粰meat澶翠俊鎭紝鏈嶅姟鍣ㄩ獙璇佹枃浠禡D5
+            var objectMeta = new ObjectMetadata
+            {
+                ContentMd5 = md5
+            };
+
+
+            var task = Task.Run(() =>
+            //鏂囦欢涓婁紶--绌洪棿鍚嶃�佹枃浠朵繚瀛樿矾寰勩�佹枃浠舵祦銆乵eta澶翠俊鎭�(鏂囦欢md5) //杩斿洖meta澶翠俊鎭�(鏂囦欢md5)
+                aliYun.PutObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], filePath, fileStream, objectMeta)
+
+
+
+              );
+            //绛夊緟瀹屾垚
+            try
+            {
+                task.Wait();
+            }
+            catch (AggregateException ex)
+            {
+
+                throw Oops.Oh(ex.Message);
+            }
+
+            //杩斿洖缁橴Editor鐨勬彃鍏ョ紪杈戝櫒鐨勫浘鐗囩殑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銆佽闂甀D銆佽闂畃assword
+            var aliYun = new OssClient(App.Configuration["FileUploadOptions:AliOSSEndpoint"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]);
+            //灏嗘枃浠秏d5鍊艰祴鍊肩粰meat澶翠俊鎭紝鏈嶅姟鍣ㄩ獙璇佹枃浠禡D5
+            var objectMeta = new ObjectMetadata
+            {
+                ContentMd5 = md5
+            };
+            try
+            {
+                //鏂囦欢涓婁紶--绌洪棿鍚嶃�佹枃浠朵繚瀛樿矾寰勩�佹枃浠舵祦銆乵eta澶翠俊鎭�(鏂囦欢md5) //杩斿洖meta澶翠俊鎭�(鏂囦欢md5)
+                aliYun.PutObject(App.Configuration["FileUploadOptions:AliOSSBucketName"], filePath, fileStream, objectMeta);
+            }
+            catch (AggregateException ex)
+            {
+
+                throw Oops.Oh(ex.Message);
+            }
+
+
+            //杩斿洖缁橴Editor鐨勬彃鍏ョ紪杈戝櫒鐨勫浘鐗囩殑src
+
+            return App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"] + filePath;
+
+        }
+
+        #endregion
+
+
+
+
+
+        #region 鍒犻櫎鏂囦欢
+
+        /// <summary>
+        /// 闃块噷浜戝垹闄�
+        /// </summary>
+        /// <param name="options"></param>
+        /// <param name="fileUrl">甯xx.xx鐨勯摼鎺ュ湴鍧�</param>
+        /// <returns></returns>
+        public async Task<bool> DelFileForAliYunOSS(string fileUrl)
+        {
+
+
+
+
+
+
+
+
+
+
+            //鍒濆鍖栭樋閲屼簯閰嶇疆--澶栫綉Endpoint銆佽闂甀D銆佽闂畃assword
+            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);
+            }
+
+
+            //杩斿洖缁橴Editor鐨勬彃鍏ョ紪杈戝櫒鐨勫浘鐗囩殑src
+
+            return true;
+
+        }
+        #endregion
+
+
+    }
+}
diff --git a/cylsg/EzUpFile/EzUpFile.csproj b/cylsg/EzUpFile/EzUpFile.csproj
index fa71b7a..7e6ce6a 100644
--- a/cylsg/EzUpFile/EzUpFile.csproj
+++ b/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>
diff --git a/cylsg/EzUpFile/IEzFileUploadService.cs b/cylsg/EzUpFile/IEzFileUploadService.cs
new file mode 100644
index 0000000..3af7ecc
--- /dev/null
+++ b/cylsg/EzUpFile/IEzFileUploadService.cs
@@ -0,0 +1,30 @@
+锘縰sing 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);
+
+    }
+}
diff --git a/cylsg/EzUpFile/UpFileConfig.json b/cylsg/EzUpFile/UpFileConfig.json
new file mode 100644
index 0000000..31c4179
--- /dev/null
+++ b/cylsg/EzUpFile/UpFileConfig.json
@@ -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": ""
+    }
+  }
+}
diff --git a/cylsg/EzUpFile/UpFileController.cs b/cylsg/EzUpFile/UpFileController.cs
new file mode 100644
index 0000000..a9b428c
--- /dev/null
+++ b/cylsg/EzUpFile/UpFileController.cs
@@ -0,0 +1,80 @@
+锘縰sing 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>
+        /// 鑾峰彇鍒板鎴风鐨処Pv4
+        /// </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; }
+    }
+}
diff --git a/cylsg/cylsg.Application/LogoInController.cs b/cylsg/cylsg.Application/LogoInController.cs
index 8521f42..a97ec29 100644
--- a/cylsg/cylsg.Application/LogoInController.cs
+++ b/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, 涓嶅湪鏄庢枃涓娇鐢↖tcode 
                 NickName = user.Nickname,
                 UserID = user.Id,
 
diff --git a/cylsg/cylsg.Application/applicationsettings.json b/cylsg/cylsg.Application/applicationsettings.json
index 4b91598..47b488e 100644
--- a/cylsg/cylsg.Application/applicationsettings.json
+++ b/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": "",
 
diff --git a/cylsg/cylsg.Web.Core/cylsg.Web.Core.csproj b/cylsg/cylsg.Web.Core/cylsg.Web.Core.csproj
index b558568..76cc66d 100644
--- a/cylsg/cylsg.Web.Core/cylsg.Web.Core.csproj
+++ b/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>
diff --git a/cylsg/cylsg.Web.Entry/appsettings.json b/cylsg/cylsg.Web.Entry/appsettings.json
index c9ec59a..bb50097 100644
--- a/cylsg/cylsg.Web.Entry/appsettings.json
+++ b/cylsg/cylsg.Web.Entry/appsettings.json
@@ -24,6 +24,7 @@
 
   ],
 
+
   "DynamicApiControllerSettings": {
     "KeepName": true,
     "KeepVerb": true,

--
Gitblit v1.9.1