using System; using System.Collections.Generic; using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using OpenAuth.App; using OpenAuth.App.Request; using OpenAuth.App.Response; using OpenAuth.Repository.Domain; namespace OpenAuth.WebApi.Controllers { /// 文件上传 /// yubaolee, 2019-03-08. [Route("api/[controller]/[action]")] [ApiController] //[ApiExplorerSettings(GroupName = "文件管理_Files")] public class FilesController : ControllerBase { private FileApp _app; public FilesController(FileApp app) { _app = app; } ///// ///// 加载附件列表 ///// //[HttpGet] //public async Task Load([FromQuery] QueryFileListReq request) //{ // return await _app.Load(request); //} /// /// 加载附件列表 /// [HttpGet] public async Task>>> Load([FromQuery] QueryFileListReq request) { var result = new Response>>(); try { return await _app.Load(request); } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } /// /// 删除附件 /// /// /// [HttpPost] public Response Delete([FromBody] long[] ids) { var result = new Response(); try { _app.Delete(ids); } catch (Exception ex) { result.Code = 500; result.Message = ex.InnerException?.Message ?? ex.Message; } return result; } /// /// 批量上传文件接口 /// 客户端文本框需设置name='files' /// /// /// 服务器存储的文件信息 [HttpPost] [RequestSizeLimit(214748364800)] public Response> Upload(IFormFileCollection files) { var result = new Response>(); try { result.Result = _app.Add(files); } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } /// /// 批量上传文件接口 /// 客户端文本框需设置name='files' /// /// /// 服务器存储的文件信息 [HttpPost] [RequestSizeLimit(214748364800)] [AllowAnonymous] public Response UploadSingle(IFormFile file) { var result = new Response(); try { result.Result = _app.Add(file); } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } //断点续传 private readonly string _uploadFolder = "Uploads"; // 上传文件的存储路径 [HttpPost] [AllowAnonymous] public async Task UploadFileChunk(IFormFile file, [FromForm] string fileName, [FromForm] int chunkIndex, [FromForm] int totalChunks) { if (!Directory.Exists(_uploadFolder)) { Directory.CreateDirectory(_uploadFolder); } if (file == null || file.Length == 0) { return BadRequest("Invalid file chunk."); } var filePath = Path.Combine(_uploadFolder, $"{fileName}.part_{chunkIndex}"); using (var stream = new FileStream(filePath, FileMode.Create)) { await file.CopyToAsync(stream); } // Check if all chunks are uploaded if (IsAllChunksUploaded(fileName, totalChunks)) { MergeChunks(fileName, totalChunks); } return Ok(new { Message = "Chunk uploaded successfully." }); } private bool IsAllChunksUploaded(string fileName, int totalChunks) { for (int i = 0; i < totalChunks; i++) { var filePath = Path.Combine(_uploadFolder, $"{fileName}.part_{i}"); if (!System.IO.File.Exists(filePath)) { return false; } } return true; } private void MergeChunks(string fileName, int totalChunks) { var finalFilePath = Path.Combine(_uploadFolder, fileName); using (var finalFile = new FileStream(finalFilePath, FileMode.Create)) { for (int i = 0; i < totalChunks; i++) { var chunkFilePath = Path.Combine(_uploadFolder, $"{fileName}.part_{i}"); using (var chunkFile = new FileStream(chunkFilePath, FileMode.Open)) { chunkFile.CopyTo(finalFile); } System.IO.File.Delete(chunkFilePath); // 删除临时分片文件 } } } [HttpGet] [AllowAnonymous] public IActionResult GetUploadStatus([FromQuery] string fileName) { var chunkFiles = Directory.GetFiles(_uploadFolder, $"{fileName}.part_*"); var uploadedChunks = chunkFiles.Length; return Ok(new { UploadedChunks = uploadedChunks }); } } }