diff --git a/Tiobon.Core.Api/Controllers/FileController.cs b/Tiobon.Core.Api/Controllers/FileController.cs index ea7659e0..764bfdb7 100644 --- a/Tiobon.Core.Api/Controllers/FileController.cs +++ b/Tiobon.Core.Api/Controllers/FileController.cs @@ -209,17 +209,12 @@ public class FileController : BaseApiController /// /// 分片上传 /// - /// - /// - /// - /// - /// + /// /// [HttpPost("UploadLarge")] - public async Task UploadLargeAsync(IFormFile file, string fileName, int chunkIndex, int totalChunks, string id) + public async Task> UploadLargeAsync([FromForm] ChunkUpload upload) { - dynamic obj = await _ghre_AttachmentServices.UploadVideoAsync(file, fileName, chunkIndex, totalChunks, id); - return Ok(obj); + return await _ghre_AttachmentServices.UploadVideoAsync(upload); } #endregion diff --git a/Tiobon.Core.Api/Tiobon.Core.xml b/Tiobon.Core.Api/Tiobon.Core.xml index 04dab34a..94b1f492 100644 --- a/Tiobon.Core.Api/Tiobon.Core.xml +++ b/Tiobon.Core.Api/Tiobon.Core.xml @@ -377,15 +377,11 @@ 主键ID - + 分片上传 - - - - - + diff --git a/Tiobon.Core.IServices/Ghre/IGhre_AttachmentServices.cs b/Tiobon.Core.IServices/Ghre/IGhre_AttachmentServices.cs index e01da876..f9f8bb82 100644 --- a/Tiobon.Core.IServices/Ghre/IGhre_AttachmentServices.cs +++ b/Tiobon.Core.IServices/Ghre/IGhre_AttachmentServices.cs @@ -1,15 +1,16 @@ -using Microsoft.AspNetCore.Http; -using Tiobon.Core.IServices.BASE; +using Tiobon.Core.IServices.BASE; +using Tiobon.Core.Model; using Tiobon.Core.Model.Models; +using Tiobon.Core.Model.ViewModels; namespace Tiobon.Core.IServices -{ - /// - /// 附件(自定义服务接口) - /// +{ + /// + /// 附件(自定义服务接口) + /// public interface IGhre_AttachmentServices :IBaseServices { - Task UploadVideoAsync(IFormFile file, string fileName, int chunkIndex, int totalChunks, string id); + Task> UploadVideoAsync(ChunkUpload upload); } } \ No newline at end of file diff --git a/Tiobon.Core.Model/ViewModels/Extend/ChunkUpload.cs b/Tiobon.Core.Model/ViewModels/Extend/ChunkUpload.cs new file mode 100644 index 00000000..1c015f12 --- /dev/null +++ b/Tiobon.Core.Model/ViewModels/Extend/ChunkUpload.cs @@ -0,0 +1,13 @@ +using Microsoft.AspNetCore.Http; + +namespace Tiobon.Core.Model; + +public class ChunkUpload +{ + public IFormFile file { get; set; } + + public string fileName { get; set; } = null; + public int chunkIndex { get; set; } + public int totalChunks { get; set; } + public string id { get; set; } = null; +} \ 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 f8c80af5..d3241d3c 100644 --- a/Tiobon.Core.Services/Ghre/Ghre_AttachmentServices.cs +++ b/Tiobon.Core.Services/Ghre/Ghre_AttachmentServices.cs @@ -3,9 +3,14 @@ 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; +using Tiobon.Core.Model; +using Tiobon.Core.DataAccess; +using NPOI.HPSF; +using SharpCompress.Common; +using Tiobon.Core.Common; +using Tiobon.Core.Model.ViewModels; namespace Tiobon.Core.Services { @@ -21,37 +26,62 @@ namespace Tiobon.Core.Services base.BaseDal = dal; } - public async Task UploadVideoAsync(IFormFile file, string fileName, int chunkIndex, int totalChunks, string id) + public async Task> UploadVideoAsync(ChunkUpload upload) { - dynamic obj = new ExpandoObject(); - string status = "error"; - string message = string.Empty; - string pathHeader = string.Empty; - string url = string.Empty; + var file = upload.file; + var path = $"{$"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}upload{Path.DirectorySeparatorChar}{upload.id}{Path.DirectorySeparatorChar}"}"; + if (!Directory.Exists(path)) + Directory.CreateDirectory(path); + using (var stream = File.Create(path + $"{upload.chunkIndex}")) + { + await file.CopyToAsync(stream); + } - try + if (upload.chunkIndex == upload.totalChunks - 1) { - 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}")) + var id = SnowFlakeSingle.Instance.NextId(); + await FileMerge(upload.id, ".mp4", id); + using var _context = ContextFactory.CreateContext(); + + var ext = string.Empty; + if (string.IsNullOrEmpty(file.FileName) == false) { - await file.CopyToAsync(stream); + var dotPos = upload.fileName.LastIndexOf('.'); + ext = upload.fileName.Substring(dotPos + 1); } - - if (chunkIndex == totalChunks - 1) - await FileMerge(id, ".mp4", SnowFlakeSingle.Instance.NextId()); - - status = "ok"; - } - catch (Exception E) - { - message = E.Message; + var filePath = $"/files/upload/{id}.{ext}"; + var fileAttachment = new Ghre_Attachment(); + fileAttachment.Id = SnowFlakeSingle.Instance.NextId(); + fileAttachment.AttachmentNo = upload.file.FileName; + fileAttachment.AttachFileName = upload.file.FileName; + fileAttachment.CreateBy = App.User.ID; + fileAttachment.CreateTime = DateTime.Now; + fileAttachment.AttachmentName = upload.fileName; + fileAttachment.AttachFileExtension = ext; + fileAttachment.AttachFileSize = upload.file.Length; + fileAttachment.PhysicsPath = filePath; + fileAttachment.RelativePath = filePath; + fileAttachment.FileURL = filePath; + fileAttachment.ThumbnailPath = filePath; + fileAttachment.AttachmentType = upload.file.ContentType; + //url = fileName + "." + ext; + _context.Add(fileAttachment); + _context.SaveChanges(); + return ServiceResult.OprateSuccess("", new FileUploadResult() + { + Id = fileAttachment.Id, + AttachFileExtension = fileAttachment.AttachFileExtension, + AttachFileName = fileAttachment.AttachFileName, + AttachmentName = fileAttachment.AttachmentName, + AttachmentNo = fileAttachment.AttachmentNo, + FileURL = fileAttachment.FileURL, + PhysicsPath = fileAttachment.PhysicsPath, + RelativePath = fileAttachment.RelativePath, + ThumbnailPath = fileAttachment.ThumbnailPath, + AttachFileSize = fileAttachment.AttachFileSize, + }); } - obj.url = url; - obj.status = status; - obj.message = message; - return obj; + return ServiceResult.OprateSuccess("", null); } public static async Task FileMerge(string lastModified, string fileExts, long NewfileName) @@ -60,7 +90,7 @@ namespace Tiobon.Core.Services bool ok = false; try { - string wwwroot = $"{Directory.GetCurrentDirectory()}/wwwroot/"; + string wwwroot = $"{Directory.GetCurrentDirectory()}/wwwroot/files/upload/"; var temporary = Path.Combine(wwwroot, lastModified);//临时文件夹 //fileName = Request.Form["fileName"];//文件名 string fileExt = fileExts;//获取文件后缀 @@ -69,7 +99,7 @@ namespace Tiobon.Core.Services if (!di.Exists) di.Create(); - var finalPath = Path.Combine(wwwroot + lastModified + "/", NewfileName + fileExt);//最终的文件名(demo中保存的是它上传时候的文件名,实际操作肯定不能这样) + var finalPath = Path.Combine(wwwroot, 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 { diff --git a/Tiobon.Core/Tiobon.Core.xml b/Tiobon.Core/Tiobon.Core.xml index 04dab34a..94b1f492 100644 --- a/Tiobon.Core/Tiobon.Core.xml +++ b/Tiobon.Core/Tiobon.Core.xml @@ -377,15 +377,11 @@ 主键ID - + 分片上传 - - - - - +