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; public Ghre_AttachmentServices(IBaseRepository dal) { this._dal = dal; base.BaseDal = dal; } public async Task UploadVideoAsync(IFormFile file, string fileName, 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; } } }