From 97c05b43710e5a368fc52b839af66b318fcb0cff Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 8 Aug 2022 13:38:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E8=B0=83=E6=95=B4=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/UploadDownLoadController.cs | 62 ++++++++++++------- IRaCIS.Core.API/IRaCIS.Core.API.xml | 4 +- .../BusinessFilter/ModelBinding.cs | 2 +- 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index 42cbe3dee..63052fb06 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -24,6 +24,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.StaticFiles; using Microsoft.AspNetCore.WebUtilities; @@ -36,6 +37,7 @@ using SharpCompress.Archives; using System; using System.Collections.Generic; using System.Data; +using System.Globalization; using System.IO; using System.Linq; using System.Text; @@ -131,11 +133,13 @@ namespace IRaCIS.Core.API.Controllers /// 流式上传 Dicom上传 [Route("base")] - public virtual async Task DicomFileUploadAsync(Func filePathFunc) + public virtual async Task DicomFileUploadAsync(Func filePathFunc,string boundary) { var fileCount = 0; - var boundary = HeaderUtilities.RemoveQuotes(MediaTypeHeaderValue.Parse(Request.ContentType).Boundary).Value; + + //var boundary = HeaderUtilities.RemoveQuotes(MediaTypeHeaderValue.Parse(Request.ContentType).Boundary).Value; + //var boundary = mediaTypeHeader.Boundary.Value; var reader = new MultipartReader(boundary, HttpContext.Request.Body); @@ -171,7 +175,7 @@ namespace IRaCIS.Core.API.Controllers //普通单个文件 else { - if (mediaType.Contains("octet-stream")||mediaType.Contains("dicom")) + if (mediaType.Contains("octet-stream") || mediaType.Contains("dicom")) { ++fileCount; @@ -183,7 +187,7 @@ namespace IRaCIS.Core.API.Controllers section = await reader.ReadNextSectionAsync(); } - return fileCount; + //return fileCount; } @@ -220,22 +224,36 @@ namespace IRaCIS.Core.API.Controllers /// Dicom 归档 - [HttpPost, Route("Study/ArchiveStudy/{trialId:guid}")] + [HttpPost, Route("Study/ArchiveStudy")] [DisableFormValueModelBinding] [DisableRequestSizeLimit] - [TypeFilter(typeof(TrialResourceFilter))] - public async Task ArchiveStudyNew([FromForm] ArchiveStudyCommand archiveStudyCommand, + //[TypeFilter(typeof(TrialResourceFilter))] + public async Task ArchiveStudyNew(/*[FromForm] ArchiveStudyCommand archiveStudyCommand,*/ Guid trialId, Guid subjectVisitId, string studyInstanceUid, Guid? abandonStudyId, [FromServices] ILogger _logger, [FromServices] IEasyCachingProvider _provider, [FromServices] IStudyService _studyService, - [FromServices] IHubContext _uploadHub, + [FromServices] IHubContext _uploadHub, [FromServices] IDicomArchiveService _dicomArchiveService, [FromServices] IRepository _repository ) { + _logger.LogError("请求到达接口"); + // validation of Content-Type + // 1. first, it must be a form-data request + // 2. a boundary should be found in the Content-Type + if (!HttpContext.Request.HasFormContentType || + !MediaTypeHeaderValue.TryParse(HttpContext.Request.ContentType, out var mediaTypeHeader) || + string.IsNullOrEmpty(mediaTypeHeader.Boundary.Value)) + { + return ResponseOutput.NotOk("不支持的MediaType"); + } + + var archiveStudyCommand = new ArchiveStudyCommand() { AbandonStudyId = abandonStudyId, StudyInstanceUid = studyInstanceUid, SubjectVisitId = subjectVisitId }; + + string studycode = string.Empty; var startTime = DateTime.Now; @@ -262,7 +280,7 @@ namespace IRaCIS.Core.API.Controllers var savedInfo = _studyService.GetSaveToDicomInfo(archiveStudyCommand.SubjectVisitId); - archiveResult.ReceivedFileCount = await DicomFileUploadAsync(async (fileName, fileStream, receivedCount) => + await DicomFileUploadAsync(async (fileName, fileStream, receivedCount) => { try @@ -286,7 +304,7 @@ namespace IRaCIS.Core.API.Controllers await _uploadHub.Clients.User(_userInfo.Id.ToString()).ReceivProgressAsync(archiveStudyCommand.StudyInstanceUid, receivedCount); - + archiveResult.ReceivedFileCount = receivedCount; } catch (Exception e) @@ -300,7 +318,7 @@ namespace IRaCIS.Core.API.Controllers } - }); + }, mediaTypeHeader.Boundary.Value); var studyMonitor = new StudyMonitor() { @@ -308,9 +326,9 @@ namespace IRaCIS.Core.API.Controllers SiteId = savedInfo.SiteId, SubjectId = savedInfo.SubjectId, SubjectVisitId = savedInfo.SubjectVisitId, - - + + UploadStartTime = startTime, FileSize = (decimal)HttpContext.Request.ContentLength, FileCount = archiveResult.ReceivedFileCount, @@ -321,7 +339,7 @@ namespace IRaCIS.Core.API.Controllers try { - + if (archivedStudyIds.Count > 0) // 上传成功,处理逻辑 { @@ -334,19 +352,19 @@ namespace IRaCIS.Core.API.Controllers studyMonitor.IsSuccess = true; - + //_studyService.UploadOrReUploadNeedTodo(archiveStudyCommand, archivedStudyIds, ref archiveResult, ); - + } else { studyMonitor.IsSuccess = false; - studyMonitor.Note= JsonConvert.SerializeObject(archiveResult); + studyMonitor.Note = JsonConvert.SerializeObject(archiveResult); _provider.Remove("StudyUid_" + archiveStudyCommand.StudyInstanceUid); - + } @@ -356,16 +374,16 @@ namespace IRaCIS.Core.API.Controllers { studyMonitor.IsSuccess = false; - studyMonitor.Note = JsonConvert.SerializeObject(new { Message=e.Message,Result= archiveResult }); + studyMonitor.Note = JsonConvert.SerializeObject(new { Message = e.Message, Result = archiveResult }); _logger.LogError(e.Message + e.StackTrace); - + } finally { _provider.Remove("StudyUid_" + archiveStudyCommand.StudyInstanceUid); - studyMonitor.StudyId = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.Id??Guid.Empty; + studyMonitor.StudyId = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.Id ?? Guid.Empty; studyMonitor.StudyCode = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.StudyCode; studyMonitor.UploadFinishedTime = DateTime.Now; await _repository.AddAsync(studyMonitor, true); @@ -373,7 +391,7 @@ namespace IRaCIS.Core.API.Controllers } - + return ResponseOutput.Result(studyMonitor.IsSuccess, archiveResult); diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.xml b/IRaCIS.Core.API/IRaCIS.Core.API.xml index 960630722..90c23372b 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.xml +++ b/IRaCIS.Core.API/IRaCIS.Core.API.xml @@ -220,10 +220,10 @@ 流式上传 通用封装 不返回任何数据,后续还有事情处理 - + 流式上传 Dicom上传 - + Dicom 归档 diff --git a/IRaCIS.Core.Application/BusinessFilter/ModelBinding.cs b/IRaCIS.Core.Application/BusinessFilter/ModelBinding.cs index 9a8d8bc9d..c04d0ba5f 100644 --- a/IRaCIS.Core.Application/BusinessFilter/ModelBinding.cs +++ b/IRaCIS.Core.Application/BusinessFilter/ModelBinding.cs @@ -16,7 +16,7 @@ namespace IRaCIS.Core.Application.Filter var factories = context.ValueProviderFactories; //factories.RemoveType(); factories.RemoveType(); - //factories.RemoveType(); + factories.RemoveType(); context.HttpContext.Request.EnableBuffering(); }