移动系统liao
2025-02-18 8b613a5275e6fe23b91f65cc6a7fba720ae4d7ef
完成阿里云本地上传token生成,实现小程序本地上传
7个文件已修改
1个文件已添加
323 ■■■■■ 已修改文件
ali本地上key和其他配置.txt 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzUpFile/EzFileUploadService.cs 247 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzUpFile/EzUpFile.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzUpFile/IEzFileUploadService.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzUpFile/UpFileController.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/CyOS/CyOSBaoXiaoZHuGuanController.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/CyOS/CyOSStaffController.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/OaWorkPlan.cs 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ali±¾µØÉÏkeyºÍÆäËûÅäÖÃ.txt
New file
@@ -0,0 +1,15 @@
AccessKey ID:  LTAI5tKegnEbaSRPFRwDxeFd
 AccessKey Secret:9Hv6VYgWhpDHCMkwMLHiqF6ihusjdl
 weixinupdata@1299465997752835.onaliyun.com
 ç”¨æˆ·ç™»å½•名称 weixinupdata@1299465997752835.onaliyun.com
AccessKey ID LTAI5tKegnEbaSRPFRwDxeFd
AccessKey Secret 9Hv6VYgWhpDHCMkwMLHiqF6ihusjdl
     RoleArn = "acs:ram::1299465997752835:role/weixinupdatarl",
     RoleSessionName = "weixinupdataRl",
cylsg/EzUpFile/EzFileUploadService.cs
@@ -1,5 +1,7 @@

using Aliyun.Acs.Core.Exceptions;
using Aliyun.OSS;
using Aliyun.OSS.Util;
using cylsg.utility;
using cylsg.utility.Extend;
@@ -10,14 +12,16 @@
using Microsoft.AspNetCore.Http;
using SqlSugar;
using System;
using System.Buffers.Text;
using System.Drawing;
using System.Globalization;
using System.Security.Policy;
using System.Security.Cryptography;
using System.Text;
using Tea;
using TencentCloud.Ocr.V20181119.Models;
using TencentCloud.Teo.V20220901.Models;
using Task = System.Threading.Tasks.Task;
using Newtonsoft.Json;
using static AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleResponseBody;
namespace EzUpFile
{
    /// <summary>
@@ -29,12 +33,12 @@
        private readonly HttpRequest? _request;
        private readonly ISqlSugarClient _sqlSugarClient;
        private readonly ITencentCloudService _tcs;
        public EzFileUploadService(IHttpContextAccessor httpContext, ISqlSugarClient sqlSugarClient,ITencentCloudService tencentCloudService)
        public EzFileUploadService(IHttpContextAccessor httpContext, ISqlSugarClient sqlSugarClient, ITencentCloudService tencentCloudService)
        {
            _request = httpContext.HttpContext?.Request ?? null;
            _sqlSugarClient = sqlSugarClient;
            _tcs= tencentCloudService;
            _tcs = tencentCloudService;
        }
        /// <summary>
@@ -178,7 +182,7 @@
                throw Oops.Oh(ex.Message);
            }
            //返回给UEditor的插入编辑器的图片的src
            return App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"] + filePath;
        }
@@ -349,7 +353,7 @@
                catch (Exception e)
                {
                    throw Oops.Oh(e.Message+"腾讯云,或者阿里云操作错误");
                    throw Oops.Oh(e.Message + "腾讯云,或者阿里云操作错误");
                }
            }
            catch (Exception e)
@@ -426,7 +430,7 @@
        }
        public async Task<(bool,string)> IaiAddPerso(string CoredID,string Name,int PersonGender)
        public async Task<(bool, string)> IaiAddPerso(string CoredID, string Name, int PersonGender)
        {
            try
            {
@@ -466,12 +470,12 @@
                var arr = ms.ToArray();
                string img64 = Convert.ToBase64String(arr);
                bool  info = false;
                bool info = false;
                string url = "";
                try
                {
                    info =  _tcs.IaiAddPerso(img64, CoredID, Name, PersonGender);
                    info = _tcs.IaiAddPerso(img64, CoredID, Name, PersonGender);
                    url = await UploadFilesFByBase64(img64);
@@ -490,7 +494,7 @@
                throw Oops.Oh(e.Message);
            }
        }
/// <inheritdoc/>
        /// <inheritdoc/>
        public async Task<(bool, string)> IaiAddPerso(string imgBase64, string CoredID, string Name, int PersonGender)
        {
@@ -527,5 +531,224 @@
        #endregion
        #region æœ¬åœ°ä¸Šä¼ äº‘服务器凭证计算
        public Dictionary<string, string> GetToken1()
        {
            var dir = DateTime.Now.ToString("yyyyMMdd") + "/";
            // æž„造OssClient实例。 endpoint æ ¼å¼:https://oss-cn-beijing.aliyuncs.com
            //  var ossClient = new OssClient( App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]);
            var rt = GetSTSToken();
            String securityToken = rt.AccessKeySecret;   //获取Token
            var config = new PolicyConditions();
            config.AddConditionItem(PolicyConditions.CondContentLengthRange, 1, 1024L * 1024 * 1024 * 5);// æ–‡ä»¶å¤§å°èŒƒå›´ï¼šå•位byte
            config.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, dir);
            //捅名
            config.AddConditionItem("bucket", App.Configuration["FileUploadOptions:AliOSSBucketName"]);
            config.AddConditionItem("x-oss-signature-version", "OSS4-HMAC-SHA256");
            config.AddConditionItem("x-oss-security-token", securityToken);
            //     //请求时间
            config.AddConditionItem("x-oss-date", DateTime.Now.ToString("yyyyMMdd'T'HHmmss'Z'"));
            config.AddConditionItem("x-oss-credential", App.Configuration["FileUploadOptions:AliOSSAccessKeyID"] + "/" + DateTime.Now.ToString("yyyyMMdd") + "/cn-chengdu/oss/aliyun_v4_request");
            var expire = DateTimeOffset.Now.AddMinutes(30);// è¿‡æœŸæ—¶é—´
            // ç”Ÿæˆ Policy,并进行 Base64 ç¼–码
            //  var policy = ossClient.GeneratePostPolicy(expire.LocalDateTime, config);
            //   var policyBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(policy));
            // è®¡ç®—签名
            var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]));
            //    var bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(policyBase64));
            //  var sign = Convert.ToBase64String(bytes);
            return new Dictionary<string, string>();
        }
        public static AlibabaCloud.SDK.Sts20150401.Client CreateClient()
        {
            // å·¥ç¨‹ä»£ç æ³„露可能会导致 AccessKey æ³„露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
            // å»ºè®®ä½¿ç”¨æ›´å®‰å…¨çš„ STS æ–¹å¼ï¼Œæ›´å¤šé‰´æƒè®¿é—®æ–¹å¼è¯·å‚见:https://help.aliyun.com/document_detail/378671.html。
            AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config
            {
                // å¿…填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
                AccessKeyId = "LTAI5tKegnEbaSRPFRwDxeFd",
                // å¿…填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                AccessKeySecret = "9Hv6VYgWhpDHCMkwMLHiqF6ihusjdl",
            };
            // Endpoint è¯·å‚考 https://api.aliyun.com/product/Sts
            config.Endpoint = "sts.cn-chengdu.aliyuncs.com";
            return new AlibabaCloud.SDK.Sts20150401.Client(config);
        }
        /// <summary>
        /// èŽ·å–ä¸´æ—¶å‡­è¯
        /// </summary>
        public static AssumeRoleResponseBodyCredentials GetSTSToken()
        {
            AlibabaCloud.SDK.Sts20150401.Client client = CreateClient();
            AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest assumeRoleRequest = new AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest
            {
                Policy = "{\"Statement\": [{\"Action\": [\"*\"],\"Effect\": \"Allow\",\"Resource\": [\"*\"]}],\"Version\":\"1\"}",
                DurationSeconds = 3600,
                RoleArn = "acs:ram::1299465997752835:role/weixinupdatarl",
                RoleSessionName = "weixinupdataRl",
            };
            AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            try
            {
                // å¤åˆ¶ä»£ç è¿è¡Œè¯·è‡ªè¡Œæ‰“印 API çš„返回值
                var data = client.AssumeRoleWithOptions(assumeRoleRequest, runtime);
                if (data.StatusCode == 200)
                {
                    return data.Body?.Credentials;
                }
                throw Oops.Oh("阿里云获取临时凭证错误");
            }
            catch (TeaException error)
            {
                AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
                throw;
            }
            catch (Exception _error)
            {
                TeaException error = new TeaException(new Dictionary<string, object>
                {
                    { "message", _error.Message }
                });
                AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
                throw error;
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public Dictionary<string, string> GetToken()
        {
            // èŽ·å–çŽ¯å¢ƒå˜é‡
            string regionId = "cn-chengdu";
            string roleSessionName = "weixinupdataRl";
            // å®šä¹‰STS临时访问凭证变量
            string stsAccessKeyId = null;
            string stsSecretAccessKey = null;
            string securityToken = null;
            try
            {
                var rt = GetSTSToken();
                stsAccessKeyId = rt.AccessKeyId;
                stsSecretAccessKey = rt.AccessKeySecret;
                securityToken = rt.SecurityToken;
            }
            catch (ServerException e)
            {
                throw;
            }
            catch (ClientException e)
            {
                throw;
            }
            // æ ¼å¼åŒ–请求日期
            DateTimeOffset now = DateTimeOffset.UtcNow;
            string dtObj1 = now.ToString("yyyyMMdd'T'HHmmss'Z'", CultureInfo.InvariantCulture);
            string dtObj2 = now.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
            string expirationTime = now.AddHours(3).ToString("yyyy-MM-dd'T'HH:mm:ss.fff'Z'", CultureInfo.InvariantCulture);
            // åˆ›å»ºpolicy
            Dictionary<string, object> policy = new Dictionary<string, object>
        {
            { "expiration", expirationTime },
            { "conditions", new List<object>
                {
                    new Dictionary<string, string> { { "bucket", App.Configuration["FileUploadOptions:AliOSSBucketName"] } }, // è¯·å°†<bucketname>替换为您的实际Bucket名称
                    new Dictionary<string, string> { { "x-oss-signature-version", "OSS4-HMAC-SHA256" } },
                    new Dictionary<string, string> { { "x-oss-credential", $"{stsAccessKeyId}/{dtObj2}/{regionId}/oss/aliyun_v4_request" } }, // è¯·å°†<cn-hangzhou>替换为您的实际Bucket所处地域,例如北京地域为:cn-beijing
                    new Dictionary<string, string> { { "x-oss-security-token", securityToken } },
                    new Dictionary<string, string> { { "x-oss-date", dtObj1 } }
                }
            }
        };
            string jsonPolicy = JsonConvert.SerializeObject(policy);
            // æž„造待签名字符串(StringToSign)
            string stringToSign = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonPolicy));
            // è®¡ç®—SigningKey
            byte[] dateKey = HmacSha256("aliyun_v4" + stsSecretAccessKey, dtObj2);
            byte[] dateRegionKey = HmacSha256(dateKey, regionId); // è¯·å°†<cn-hangzhou>替换为您的实际Bucket所处地域,例如北京地域为:cn-beijing
            byte[] dateRegionServiceKey = HmacSha256(dateRegionKey, "oss");
            byte[] signingKey = HmacSha256(dateRegionServiceKey, "aliyun_v4_request");
            // è®¡ç®—Signature
            byte[] result = HmacSha256(signingKey, stringToSign);
            string signature = BitConverter.ToString(result).Replace("-", "").ToLower();
            Dictionary<string, string> messageMap = new Dictionary<string, string>
        {
            { "security_token", securityToken },
            { "signature", signature },
            { "x_oss_date", dtObj1 },
            { "x_oss_credential", $"{stsAccessKeyId}/{dtObj2}/{regionId}/oss/aliyun_v4_request" }, // è¯·å°†<cn-hangzhou>替换为您的实际Bucket所处地域,例如北京地域为:cn-beijing
            { "x_oss_signature_version", "OSS4-HMAC-SHA256" },
            { "policy", stringToSign }
        };
            // æ‰“印返回至客户端的签名信息
            return messageMap;
        }
        private static byte[] HmacSha256(byte[] key, string message)
        {
            using (HMACSHA256 hmac = new HMACSHA256(key))
            {
                return hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
            }
        }
        private static byte[] HmacSha256(string key, string message)
        {
            using (HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key)))
            {
                return hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
            }
        }
        #endregion
    }
}
cylsg/EzUpFile/EzUpFile.csproj
@@ -8,7 +8,11 @@
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.1.4" />
    <PackageReference Include="Aliyun.Acs.Core" Version="1.0.1" />
    <PackageReference Include="Aliyun.Acs.Sts" Version="1.0.1" />
    <PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
    <PackageReference Include="Utf8Json" Version="1.3.7" />
  </ItemGroup>
  <ItemGroup>
cylsg/EzUpFile/IEzFileUploadService.cs
@@ -59,6 +59,12 @@
        /// <returns></returns>
        Task<(bool, string)> IaiAddPerso(string imgBase64, string CoredID, string Name, int PersonGender);
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        Dictionary<string, string> GetToken();
    }
cylsg/EzUpFile/UpFileController.cs
@@ -5,6 +5,7 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.IdentityModel.Abstractions;
using StackExchange.Profiling.Internal;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -21,8 +22,16 @@
    [ApiDescriptionSettings("FileUpdata")]    
    public class UpFileController
    {
        /// <summary>
        /// èŽ·å–æ–‡ä»¶ ä¸Šä¼ token
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public Dictionary<string, string> GetToken([FromServices] IEzFileUploadService fileUploadService)
        {
            return fileUploadService.GetToken();
        }
        /// <summary>
        /// ä¸Šä¼ èº«ä»½è¯ä¿¡æ¯
        /// </summary>   
cylsg/cylsg.Application/CyOS/CyOSBaoXiaoZHuGuanController.cs
@@ -25,8 +25,29 @@
            _OAServices = oaservices;
            _SugarClient = sugarClient.AsTenant().GetConnection("ECTESTOADB");
        }
        /// <summary>
        /// æŸ¥è¯¢
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [AllowAnonymous]
        public async Task<List<OaWorkPlan>> gettest()
        {
            var datal = await _SugarClient.Queryable<OaWorkPlan>().Where(x=>x.PlanType==3&&x.PlanDataType==17)
         .Select(x => new OaWorkPlan
         {
             OaWorkPlanShenpi = SqlFunc.Subqueryable<OaWorkPlanShenpi>().Where(y => y.OA_WorkPlanId == x.Keyid).First()
         }, true).MergeTable()
         .OrderBy(z => z.OaWorkPlanShenpi.ApprovalTime).ToListAsync();
            return datal;
            var data2 = await _SugarClient.Queryable<OaWorkPlan>()
                .Select(x => new OaWorkPlan
                {
                    SentStaff = SqlFunc.Subqueryable<OaStaff>().Where(y => y.MemberId == x.SentStaffId).First()
                }, true).MergeTable()
                .OrderBy(y => y.SentStaff.MemberId).ToListAsync();
        }
        /// <summary>
        ///  æŸ¥è¯¢
        /// </summary>
@@ -91,7 +112,7 @@
            RefAsync<int> totle = 0;
            //强制增加员工过滤
            var data = await _SugarClient.Queryable<OaWorkPlan>().Includes(x=>x.Depart)
                    .Includes(x=>x.OaWorkPlanShenpis.Where(y=>y.ApprovalStaffId==Permissions.MemberId&&y.Buzhou==1).ToList())
                    .Where(SearchList).OrderByDescending(x => x.PlanStartTime).Mapper(
cylsg/cylsg.Application/CyOS/CyOSStaffController.cs
@@ -42,6 +42,7 @@
        [HttpPost]
        public async Task<WorekPlandto> getplanelist(SearchOaWorekPlan param)
        {
            if(! await CheckRols())
            {
                throw Oops.Oh("没有权限");
cylsg/cylsg.Model/ECTEModel/OaWorkPlan.cs
@@ -139,10 +139,16 @@
        /// </summary>       
        [Navigate(NavigateType.OneToMany,  nameof(OaWorkPlanShenpi.OA_WorkPlanId), nameof(Keyid))]
        public List<OaWorkPlanShenpi>? OaWorkPlanShenpis {  get; set; }
            /// <summary>
            /// å®¡æ ¸æ—¶é—´
            /// </summary>
            [SugarColumn(ColumnName = "ApprovalTime")]
        /// <summary>
        /// çµæ—¶
        /// </summary>
        [SugarColumn(IsIgnore =true)]
        public OaWorkPlanShenpi? OaWorkPlanShenpi { get; set; }
        /// <summary>
        /// å®¡æ ¸æ—¶é—´
        /// </summary>
        [SugarColumn(ColumnName = "ApprovalTime")]
            public DateTime? ApprovalTime { get; set; }
            /// <summary>