فهرست منبع

FileController

admin 1 سال پیش
والد
کامیت
e0151501ce

+ 0 - 13
FileHandlers/FileHandlers.csproj

@@ -1,13 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
-    <ImplicitUsings>enable</ImplicitUsings>
-    <Nullable>enable</Nullable>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\src\FileStorage\FileStorage.csproj" />
-  </ItemGroup>
-
-</Project>

+ 0 - 26
FileHandlers/FwFileHandlerBase.cs

@@ -1,26 +0,0 @@
-using FileStorage;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace FileHandlers
-{
-    public abstract class FwFileHandlerBase : IFwFileHandler
-    {
-        public virtual void DeleteFile(IFileStorage file)
-        {
-        }
-
-        public virtual Stream GetFileData(IFileStorage file)
-        {
-            return null;
-        }
-
-        public virtual string Upload( string fileName, long length, string extraInfo, Stream fileData)
-        {
-            return "";
-        }
-    }
-}

+ 0 - 19
FileHandlers/FwLocalFileHandler.cs

@@ -1,19 +0,0 @@
-
-using FileStorage;
-using Microsoft.Extensions.Options;
-using System.ComponentModel.DataAnnotations;
-
-namespace FileHandlers
-{
-    [Display(Name = "local")]
-    public class FwLocalFileHandler:FwFileHandlerBase
-    {
-        private readonly IOptionsSnapshot<StorageConfiguration> _fileUploadOptions;
-
-        public FwLocalFileHandler(IOptionsSnapshot<StorageConfiguration> fileUploadOptions)
-        {
-            _fileUploadOptions = fileUploadOptions;
-        }
-
-    }
-}

+ 0 - 13
FileHandlers/IFwFileHandler.cs

@@ -1,13 +0,0 @@
-using FileStorage;
-
-namespace FileHandlers
-{
-    public interface IFwFileHandler
-    {
-        string Upload(string fileName,long length,string extraInfo, Stream fileData);
-
-        Stream GetFileData(IFileStorage file);
-
-        void DeleteFile(IFileStorage file);
-    }
-}

+ 0 - 7
FileStorage.sln

@@ -21,8 +21,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileStorage.Repository.SqlS
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileStorage.Host", "src\FileStorage.Host\FileStorage.Host.csproj", "{100524FE-F65A-4F21-835E-30C955DDF498}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileHandlers", "FileHandlers\FileHandlers.csproj", "{64758F29-4A63-4EEB-8B89-51B673F778EB}"
-EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -41,10 +39,6 @@ Global
 		{100524FE-F65A-4F21-835E-30C955DDF498}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{100524FE-F65A-4F21-835E-30C955DDF498}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{100524FE-F65A-4F21-835E-30C955DDF498}.Release|Any CPU.Build.0 = Release|Any CPU
-		{64758F29-4A63-4EEB-8B89-51B673F778EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{64758F29-4A63-4EEB-8B89-51B673F778EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{64758F29-4A63-4EEB-8B89-51B673F778EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{64758F29-4A63-4EEB-8B89-51B673F778EB}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -57,7 +51,6 @@ Global
 		{061D19E9-B714-4FA9-98C8-8192AD1D8C41} = {57BA12BF-7F0A-4CA1-AFC9-224F7D86FDD2}
 		{EE31164F-2484-408B-B14E-8A91E24B9C45} = {C459ABB0-80BD-4989-82FA-FDE742252444}
 		{100524FE-F65A-4F21-835E-30C955DDF498} = {EF133CBA-8E92-4AC3-9862-6D1839C0C900}
-		{64758F29-4A63-4EEB-8B89-51B673F778EB} = {6B729C9D-6E51-4BA2-A5E7-28196C89EEB7}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {2FA856C0-6F2F-40B6-986F-145CEB238129}

+ 68 - 0
src/FileStorage.Host/Controllers/FileController.cs

@@ -0,0 +1,68 @@
+using FileHandlers;
+using FileStorage.Repository.SqlSugar;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.StaticFiles;
+using Microsoft.Extensions.Options;
+using SqlSugar;
+
+namespace FileStorage.Host.Controllers
+{
+    [ApiController]
+    [Route("file")]
+    public class FileController : ControllerBase
+    {
+        private readonly ILogger<FileController> _logger;
+        private readonly IFileStorage _fileStorage;
+        private readonly ISugarUnitOfWork<FileStorageDbContext> _uow;
+
+        public FileController(ILogger<FileController> logger,IFileStorage fileStorage,ISugarUnitOfWork<FileStorageDbContext> uow)
+        {
+            _logger = logger;
+            _fileStorage = fileStorage;
+            _uow = uow;
+        }
+
+        [HttpPost("upload")]
+        public IActionResult Upload()
+        {
+            var fileData = Request.Form.Files[0];
+            var file = _fileStorage.Upload(fileData.FileName, fileData.Length, "", fileData.OpenReadStream(),"12345");
+            return Ok(new { Id = file.Id, fileName = file.FileName });
+        }
+
+        [HttpGet("getfileurl/{id}")]
+        public async Task<IActionResult> GetFileUrl(string id)
+        {
+            var uri = await _fileStorage.GetFileUrlAsync(id);
+            return Ok(new { Uri = uri });
+        }
+
+
+        [HttpGet("downloadfile/{id}")]
+        public async Task<IActionResult> DownLoadFile(string id)
+        {
+            var (stream,content,fileName) = _fileStorage.DownLoadFile(id);
+            if (stream!=null)
+            {
+                return File(stream, content, fileName);
+            }
+            return null;
+        }
+
+        [HttpGet("delfile/{id}")]
+        public async Task<bool> DelFile(string id)
+        {
+            return await _fileStorage.DelFileAsync(id);
+        }
+        
+
+        [HttpGet("createdb")]
+        public Task CreateDb()
+        {
+            var db = _uow.Db;
+            db.DbMaintenance.CreateDatabase();
+            db.CodeFirst.InitTables<FileMetadata>();
+            return Task.CompletedTask;
+        }
+    }
+}

+ 0 - 29
src/FileStorage.Host/Controllers/WeatherForecastController.cs

@@ -1,29 +0,0 @@
-using FileHandlers;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.Extensions.Options;
-using SqlSugar;
-
-namespace FileStorage.Host.Controllers
-{
-    [ApiController]
-    [Route("weather")]
-    public class WeatherForecastController : ControllerBase
-    {
-        private readonly ILogger<WeatherForecastController> _logger;
-        private readonly IFileStorage _fileStorage;
-
-        public WeatherForecastController(ILogger<WeatherForecastController> logger,IFileStorage fileStorage)
-        {
-            _logger = logger;
-            _fileStorage = fileStorage;
-        }
-
-        [HttpPost("upload")]
-        public IActionResult Upload()
-        {
-            var fileData = Request.Form.Files[0];
-            var file = _fileStorage.Upload(fileData.FileName, fileData.Length, "", fileData.OpenReadStream());
-            return Ok(new { Id = file.Id, fileName = file.FileName });
-        }
-    }
-}

+ 0 - 1
src/FileStorage.Host/FileStorage.Host.csproj

@@ -16,7 +16,6 @@
   </ItemGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\..\FileHandlers\FileHandlers.csproj" />
     <ProjectReference Include="..\FileStorage.Repository.SqlSugar\FileStorage.Repository.SqlSugar.csproj" />
     <ProjectReference Include="..\FileStorage\FileStorage.csproj" />
   </ItemGroup>

+ 5 - 8
src/FileStorage.Host/StartupExtensions.cs

@@ -1,14 +1,8 @@
-using FileHandlers;
-using FileStorage.Repository.SqlSugar.Extensions;
-using FluentValidation;
-using FluentValidation.AspNetCore;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Identity;
+using FileStorage.Repository.SqlSugar.Extensions;
 using Microsoft.Extensions.FileProviders;
 using Serilog;
 using XF.Domain.Dependency;
 using XF.Domain.Filters;
-using XF.Domain.Options;
 
 namespace FileStorage.Host;
 
@@ -27,7 +21,6 @@ internal static class StartupExtensions
 #endif
 
         services.Configure<StorageConfiguration>(d => configuration.GetSection(nameof(StorageConfiguration)).Bind(d));
-        services.Configure<StorageConfiguration>(d => configuration.GetSection("StorageConfiguration").Bind(d));
         // Add services to the container.
         services.BatchInjectServices();
 
@@ -103,6 +96,10 @@ internal static class StartupExtensions
 
         app.MapControllers();
 
+        app.UseStaticFiles(new StaticFileOptions { 
+            FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(),"Uploads")),
+            RequestPath = new PathString("/Uploads")
+        });
         return app;
     }
 }

+ 0 - 12
src/FileStorage.Host/StorageConfiguration.cs

@@ -1,12 +0,0 @@
-namespace FileStorage.Host
-{
-    public class StorageConfiguration
-    {
-        public string Impt { get; set; } = "default";
-    }
-
-    public class Local
-    {
-        public string Path { get; set; }
-    }
-}

+ 3 - 2
src/FileStorage.Host/config/appsettings.Development.json

@@ -1,7 +1,7 @@
 {
   "AllowedHosts": "*",
   "ConnectionStrings": {
-    "Hotline": "PORT=5432;DATABASE=filestorage;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
+    "FileStorage": "PORT=5432;DATABASE=filestorage;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;",
     "Redis": "110.188.24.182",
     "MongoDB": "mongodb://192.168.100.121:27017"
   },
@@ -16,7 +16,8 @@
   "StorageConfiguration": {
     "Impt": "Local",
     "Local": {
-      "Path": "/Uploads"
+      "Path": "Uploads",
+      "VisDomain": "http://localhost:50102/"
     },
     "Aliyun": {
 

+ 0 - 11
src/FileStorage.Host/uploads/0121b8b6631a4813af2f8a5f6e1c3096.txt

@@ -1,11 +0,0 @@
-V.20230227-1
-1.修复了通话记录同步错误的问题;(需观察测试)
-2.暂时关闭了通知前段排队数量的通道(修复后再开放);
-3.修复了小休时,来电提示设置了免打扰的问题(小休时分机不再分配来电);
-4.重新实现结束休息的方式(结束休息,分机会重新分配来电);
-5.修复了来电分配话机异常的问题(将按分机组预设的分配方式分配);
-6.修复了签入异常时会更改分机组来电分配方式的问题;
-7.修复了签出时可能分机没有移出当前分机组(仍然可以分配到来电);
-8.签出新增验证如果分机正在休息状态不能签出;
-V.20230227-2
-1.修复了签入签出可能影响其他分机休息状态的问题;

+ 0 - 11
src/FileStorage.Host/uploads/1ac44c83a9514a23bf036a69c530578a.txt

@@ -1,11 +0,0 @@
-V.20230227-1
-1.修复了通话记录同步错误的问题;(需观察测试)
-2.暂时关闭了通知前段排队数量的通道(修复后再开放);
-3.修复了小休时,来电提示设置了免打扰的问题(小休时分机不再分配来电);
-4.重新实现结束休息的方式(结束休息,分机会重新分配来电);
-5.修复了来电分配话机异常的问题(将按分机组预设的分配方式分配);
-6.修复了签入异常时会更改分机组来电分配方式的问题;
-7.修复了签出时可能分机没有移出当前分机组(仍然可以分配到来电);
-8.签出新增验证如果分机正在休息状态不能签出;
-V.20230227-2
-1.修复了签入签出可能影响其他分机休息状态的问题;

+ 0 - 11
src/FileStorage.Host/uploads/3197a8affcd34b54986328008319ad54.txt

@@ -1,11 +0,0 @@
-V.20230227-1
-1.修复了通话记录同步错误的问题;(需观察测试)
-2.暂时关闭了通知前段排队数量的通道(修复后再开放);
-3.修复了小休时,来电提示设置了免打扰的问题(小休时分机不再分配来电);
-4.重新实现结束休息的方式(结束休息,分机会重新分配来电);
-5.修复了来电分配话机异常的问题(将按分机组预设的分配方式分配);
-6.修复了签入异常时会更改分机组来电分配方式的问题;
-7.修复了签出时可能分机没有移出当前分机组(仍然可以分配到来电);
-8.签出新增验证如果分机正在休息状态不能签出;
-V.20230227-2
-1.修复了签入签出可能影响其他分机休息状态的问题;

+ 0 - 11
src/FileStorage.Host/uploads/5adc18668bb34fadbc5352510e32f7ad.txt

@@ -1,11 +0,0 @@
-V.20230227-1
-1.修复了通话记录同步错误的问题;(需观察测试)
-2.暂时关闭了通知前段排队数量的通道(修复后再开放);
-3.修复了小休时,来电提示设置了免打扰的问题(小休时分机不再分配来电);
-4.重新实现结束休息的方式(结束休息,分机会重新分配来电);
-5.修复了来电分配话机异常的问题(将按分机组预设的分配方式分配);
-6.修复了签入异常时会更改分机组来电分配方式的问题;
-7.修复了签出时可能分机没有移出当前分机组(仍然可以分配到来电);
-8.签出新增验证如果分机正在休息状态不能签出;
-V.20230227-2
-1.修复了签入签出可能影响其他分机休息状态的问题;

+ 0 - 11
src/FileStorage.Host/uploads/af0e08b475bc422fbd3a4b895a7c8ebd.txt

@@ -1,11 +0,0 @@
-V.20230227-1
-1.修复了通话记录同步错误的问题;(需观察测试)
-2.暂时关闭了通知前段排队数量的通道(修复后再开放);
-3.修复了小休时,来电提示设置了免打扰的问题(小休时分机不再分配来电);
-4.重新实现结束休息的方式(结束休息,分机会重新分配来电);
-5.修复了来电分配话机异常的问题(将按分机组预设的分配方式分配);
-6.修复了签入异常时会更改分机组来电分配方式的问题;
-7.修复了签出时可能分机没有移出当前分机组(仍然可以分配到来电);
-8.签出新增验证如果分机正在休息状态不能签出;
-V.20230227-2
-1.修复了签入签出可能影响其他分机休息状态的问题;

+ 0 - 11
src/FileStorage.Host/uploads/f13e568f412b43e5953c03bb531ca08b.txt

@@ -1,11 +0,0 @@
-V.20230227-1
-1.修复了通话记录同步错误的问题;(需观察测试)
-2.暂时关闭了通知前段排队数量的通道(修复后再开放);
-3.修复了小休时,来电提示设置了免打扰的问题(小休时分机不再分配来电);
-4.重新实现结束休息的方式(结束休息,分机会重新分配来电);
-5.修复了来电分配话机异常的问题(将按分机组预设的分配方式分配);
-6.修复了签入异常时会更改分机组来电分配方式的问题;
-7.修复了签出时可能分机没有移出当前分机组(仍然可以分配到来电);
-8.签出新增验证如果分机正在休息状态不能签出;
-V.20230227-2
-1.修复了签入签出可能影响其他分机休息状态的问题;

+ 66 - 7
src/FileStorage/DefaultFileStorage.cs

@@ -1,4 +1,5 @@
-using Microsoft.Extensions.Options;
+using Microsoft.AspNetCore.StaticFiles;
+using Microsoft.Extensions.Options;
 using XF.Domain.Dependency;
 
 namespace FileStorage;
@@ -15,8 +16,16 @@ public class DefaultFileStorage : IFileStorage, IScopeDependency
         _fileUploadOptions = optionsSnapshot;
     }
 
-
-    public FileMetadata Upload(string fileName, long length, string extraInfo, Stream fileData)
+    /// <summary>
+    /// 本地上传
+    /// </summary>
+    /// <param name="fileName"></param>
+    /// <param name="length"></param>
+    /// <param name="extraInfo"></param>
+    /// <param name="fileData"></param>
+    /// <param name="client"></param>
+    /// <returns></returns>
+    public FileMetadata Upload(string fileName, long length, string extraInfo, Stream fileData, string client)
     {
         if (fileName == null)
         {
@@ -24,10 +33,11 @@ public class DefaultFileStorage : IFileStorage, IScopeDependency
         }
         fileName = fileName.Replace("<", "").Replace(">", "").Replace(" ", "");
 
-        var rv = UploadLoca(fileName, length, extraInfo, fileData);
-        if (string.IsNullOrEmpty(rv))
+        var rv = UploadLoca(fileName, length, extraInfo, fileData,client);
+        if (!string.IsNullOrEmpty(rv))
         {
             FileMetadata fileModel = new FileMetadata();
+            fileModel.Client = client;
             fileModel.FileName = fileName;
             var ext = string.Empty;
             if (string.IsNullOrEmpty(fileName) == false)
@@ -40,14 +50,59 @@ public class DefaultFileStorage : IFileStorage, IScopeDependency
             fileModel.Length = length;
             fileModel.SaveMode = _fileUploadOptions.Value.Impt;
             fileModel.ExtraInfo = extraInfo;
+            fileModel.UploadTime = DateTime.Now;
             _fileMetadataRepository.AddAsync(fileModel);
             return fileModel;
         }
         return null;
     }
 
+    public async Task<Uri> GetFileUrlAsync(string id)
+    {
+        var fileMetadata = await _fileMetadataRepository.GetAsync(id);
+        if (fileMetadata != null)
+        {
+            return new Uri(_fileUploadOptions.Value.Local.VisDomain+fileMetadata.Path);
+        }
+        return new Uri("");
+    }
 
-    private string UploadLoca(string fileName, long length, string extraInfo, Stream fileData)
+    public (Stream stream, string contentType,string fileName) DownLoadFile(string id)
+    {
+        var fileMetadata = _fileMetadataRepository.Get(id);
+        if (fileMetadata!=null)
+        {
+            string filePath = Path.Combine(Directory.GetCurrentDirectory(), fileMetadata.Path);
+            var contentType =  TaskGetFileContentTypeAsync(fileMetadata.Path);
+            var stream = File.OpenRead(filePath);
+            return (stream,contentType,fileMetadata.FileName);
+        }
+        return (null,"","");
+    }
+
+    public async Task<bool> DelFileAsync(string id)
+    {
+        var fileMetadata = await _fileMetadataRepository.GetAsync(id);
+        if (fileMetadata!=null)
+        {
+            string filePath = Path.Combine(Directory.GetCurrentDirectory(), fileMetadata.Path);
+            await _fileMetadataRepository.RemoveAsync(id);
+            File.Delete(filePath);
+            return true;
+        }
+        return false;
+    }
+
+    private string TaskGetFileContentTypeAsync(string fileName)
+    {
+        string suffix = Path.GetExtension(fileName);
+        var provider = new FileExtensionContentTypeProvider();
+        var contentType = provider.Mappings[suffix];
+        return contentType;
+    }
+
+
+    private string UploadLoca(string fileName, long length, string extraInfo, Stream fileData,string client)
     {
         var settings = _fileUploadOptions.Value.Local;
         string groupDir = "";
@@ -57,8 +112,12 @@ public class DefaultFileStorage : IFileStorage, IScopeDependency
         }
         if (string.IsNullOrEmpty(groupDir))
         {
-            groupDir = "./uploads";
+            groupDir = "uploads";
         }
+        string sub = DateTime.Now.ToString("yyyyMMdd");
+
+        groupDir = Path.Combine(groupDir,client, sub);
+
         string pathHeader = groupDir;
 
         string fulldir = GetFullPath(pathHeader);

+ 6 - 2
src/FileStorage/IFileStorage.cs

@@ -3,8 +3,12 @@
     public interface IFileStorage
     {
 
-        FileMetadata Upload(string fileName, long length, string extraInfo, Stream fileData);
+        FileMetadata Upload(string fileName, long length, string extraInfo, Stream fileData, string client);
 
-        //string Upload(//...);
+        Task<Uri> GetFileUrlAsync(string id);
+
+        (Stream stream, string contentType,string fileName) DownLoadFile(string id);
+
+        Task<bool> DelFileAsync(string id);
     }
 }

+ 2 - 0
src/FileStorage/StorageConfiguration.cs

@@ -23,6 +23,8 @@ namespace FileStorage
     public class Local
     {
         public string Path { get; set; }
+
+        public string VisDomain { get; set; }
     }
 
     public class Aliyun