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();
}