From bf4fe5d7ad3770bd8f6cfc47fc81e6761ad19d1f Mon Sep 17 00:00:00 2001 From: xiaochanghai Date: Fri, 31 May 2024 13:58:26 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=BC=80=E5=8F=91=E5=88=86=E7=89=87=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tiobon.Core.Api/Controllers/FileController.cs | 18 +++++ .../Ghre/IGhre_AttachmentServices.cs | 5 +- .../Ghre/Ghre_AttachmentServices.cs | 78 ++++++++++++++++++- 3 files changed, 97 insertions(+), 4 deletions(-) diff --git a/Tiobon.Core.Api/Controllers/FileController.cs b/Tiobon.Core.Api/Controllers/FileController.cs index caee4845..5d19941f 100644 --- a/Tiobon.Core.Api/Controllers/FileController.cs +++ b/Tiobon.Core.Api/Controllers/FileController.cs @@ -145,4 +145,22 @@ public class FileController : BaseApiController } #endregion + #region 分片上传 + /// + /// 分片上传 + /// + /// + /// + /// + /// + /// + /// + [HttpPost("UploadLarge")] + public async Task UploadLargeAsync(IFormFile file, string videoName, int chunkIndex, int totalChunks, string id) + { + dynamic obj = await _ghre_AttachmentServices.UploadVideoAsync(file, videoName, chunkIndex, totalChunks, id); + return Ok(obj); + } + #endregion + } \ No newline at end of file diff --git a/Tiobon.Core.IServices/Ghre/IGhre_AttachmentServices.cs b/Tiobon.Core.IServices/Ghre/IGhre_AttachmentServices.cs index 14684e30..79c08d74 100644 --- a/Tiobon.Core.IServices/Ghre/IGhre_AttachmentServices.cs +++ b/Tiobon.Core.IServices/Ghre/IGhre_AttachmentServices.cs @@ -1,4 +1,5 @@ -using Tiobon.Core.IServices.BASE; +using Microsoft.AspNetCore.Http; +using Tiobon.Core.IServices.BASE; using Tiobon.Core.Model.Models; namespace Tiobon.Core.IServices @@ -8,5 +9,7 @@ namespace Tiobon.Core.IServices /// public interface IGhre_AttachmentServices :IBaseServices { + Task UploadVideoAsync(IFormFile file, string videoName, int chunkIndex, int totalChunks, string id); + } } \ No newline at end of file diff --git a/Tiobon.Core.Services/Ghre/Ghre_AttachmentServices.cs b/Tiobon.Core.Services/Ghre/Ghre_AttachmentServices.cs index dcbc32ee..f803902a 100644 --- a/Tiobon.Core.Services/Ghre/Ghre_AttachmentServices.cs +++ b/Tiobon.Core.Services/Ghre/Ghre_AttachmentServices.cs @@ -3,12 +3,15 @@ using Tiobon.Core.IServices; using Tiobon.Core.Model.Models; using Tiobon.Core.Services.BASE; using Tiobon.Core.IRepository.Base; +using Microsoft.AspNetCore.Http; +using System.Dynamic; +using SqlSugar; namespace Tiobon.Core.Services { - /// - /// 附件 (服务) - /// + /// + /// 附件 (服务) + /// public class Ghre_AttachmentServices : BaseServices, IGhre_AttachmentServices { private readonly IBaseRepository _dal; @@ -17,5 +20,74 @@ namespace Tiobon.Core.Services this._dal = dal; base.BaseDal = dal; } + + public async Task UploadVideoAsync(IFormFile file, string videoName, int chunkIndex, int totalChunks, string id) + { + dynamic obj = new ExpandoObject(); + string status = "error"; + string message = string.Empty; + string pathHeader = string.Empty; + string url = string.Empty; + + try + { + var path = $"{$"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}upload{Path.DirectorySeparatorChar}{id}{Path.DirectorySeparatorChar}"}"; + if (!Directory.Exists(path)) + Directory.CreateDirectory(path); + using (var stream = File.Create(path + $"{chunkIndex}")) + { + await file.CopyToAsync(stream); + } + + if (chunkIndex == totalChunks - 1) + await FileMerge(id, ".mp4", SnowFlakeSingle.Instance.NextId()); + + status = "ok"; + } + catch (Exception E) + { + message = E.Message; + } + obj.url = url; + obj.status = status; + obj.message = message; + return obj; + } + + public static async Task FileMerge(string lastModified, string fileExts, long NewfileName) + { + string erro = ""; + bool ok = false; + try + { + string wwwroot = $"{Directory.GetCurrentDirectory()}/wwwroot/"; + var temporary = Path.Combine(wwwroot, lastModified);//临时文件夹 + //fileName = Request.Form["fileName"];//文件名 + string fileExt = fileExts;//获取文件后缀 + var files = Directory.GetFiles(temporary);//获得下面的所有文件 + DirectoryInfo di = new DirectoryInfo(wwwroot + NewfileName + "/"); + if (!di.Exists) + di.Create(); + + var finalPath = Path.Combine(wwwroot + lastModified + "/", NewfileName + fileExt);//最终的文件名(demo中保存的是它上传时候的文件名,实际操作肯定不能这样) + var fs = new FileStream(finalPath, FileMode.Create); + foreach (var part in files.OrderBy(x => x.Length).ThenBy(x => x))//排一下序,保证从0-N Write + { + var bytes = File.ReadAllBytes(part); + await fs.WriteAsync(bytes, 0, bytes.Length); + bytes = null; + //System.IO.File.Delete(part);//删除分块 + } + fs.Close(); + + //Directory.Delete(temporary);//删除文件夹 + ok = true; + } + catch (Exception ex) + { + erro = ex.Message; + } + return ok; + } } } \ No newline at end of file