移动系统liao
2024-08-15 f5ff0b0492e2799226234dfd8633877b8f9a81d7
完成阿里云文件上传APi和服务
6个文件已修改
2个文件已删除
4个文件已添加
465 ■■■■■ 已修改文件
.gitignore 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzTencentCloud/Class1.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzUpFile/Class1.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzUpFile/EzFileUploadService.cs 282 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzUpFile/EzUpFile.csproj 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzUpFile/IEzFileUploadService.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzUpFile/UpFileConfig.json 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzUpFile/UpFileController.cs 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/LogoInController.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/applicationsettings.json 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Web.Core/cylsg.Web.Core.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Web.Entry/appsettings.json 1 ●●●● 补丁 | 查看 | 原始文档 | 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,