From efd24ab9ba623cafcc8c0a7fa03d0fa8403ad6e3 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 18 Dec 2025 09:33:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=A4=A7=E5=B0=8F=E5=92=8C?= =?UTF-8?q?=E5=BD=B1=E5=83=8F=E6=95=B0=E9=87=8F=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/UploadDownLoadController.cs | 194 ++++++++++-------- 1 file changed, 113 insertions(+), 81 deletions(-) diff --git a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs index f5b71c0da..7a6a2ab32 100644 --- a/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs +++ b/IRaCIS.Core.API/Controllers/UploadDownLoadController.cs @@ -943,6 +943,9 @@ namespace IRaCIS.Core.API.Controllers var progress = new { + TotalCount= totalCount, + TotalSize= totalSize, + CountPercent = totalCount > 0 ? Math.Round(receivedCount * 100m / totalCount, 2).ToString() : "0", @@ -1002,52 +1005,64 @@ namespace IRaCIS.Core.API.Controllers { foreach (var instance in series.InstanceList) { - //当前完成大小 - receivedSize = receivedSize + instance.FileSize ?? 0; - receivedCount++; - abortToken.ThrowIfCancellationRequested(); - - var entryPath = - $"{patient.PatientIdStr}/{studyTime}_{modalitysStr}/IMAGE/{instance.FileName}"; - - var entry = zip.CreateEntry(entryPath, CompressionLevel.Fastest); - - await using var entryStream = entry.Open(); - await using var source = await _oSSService.GetStreamFromOSSAsync(instance.Path); - - #region 将多帧合并为一帧 - - // 如果你是从 stream 打开 - var dicomFile = await DicomFile.OpenAsync(source); - - // 获取 Pixel Data 标签 - var pixelData = DicomPixelData.Create(dicomFile.Dataset); - //获取像素是否为封装形式 - var syntax = dicomFile.Dataset.InternalTransferSyntax; - - //对于封装像素的文件做转换 - if (syntax.IsEncapsulated) + try { - // 创建一个新的片段序列 - var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); - // 获取每帧数据并封装为单独的片段 - for (int n = 0; n < pixelData.NumberOfFrames; n++) + //当前完成大小 + receivedSize = receivedSize + instance.FileSize ?? 0; + receivedCount++; + + abortToken.ThrowIfCancellationRequested(); + + var entryPath = + $"{patient.PatientIdStr}/{studyTime}_{modalitysStr}/IMAGE/{instance.FileName}"; + + var entry = zip.CreateEntry(entryPath, CompressionLevel.Fastest); + + await using var entryStream = entry.Open(); + await using var source = await _oSSService.GetStreamFromOSSAsync(instance.Path); + + #region 将多帧合并为一帧 + + // 如果你是从 stream 打开 + var dicomFile = await DicomFile.OpenAsync(source); + + // 获取 Pixel Data 标签 + var pixelData = DicomPixelData.Create(dicomFile.Dataset); + //获取像素是否为封装形式 + var syntax = dicomFile.Dataset.InternalTransferSyntax; + + //对于封装像素的文件做转换 + if (syntax.IsEncapsulated) { - var frameData = pixelData.GetFrame(n); - newFragments.Fragments.Add(new MemoryByteBuffer(frameData.Data)); + // 创建一个新的片段序列 + var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); + // 获取每帧数据并封装为单独的片段 + for (int n = 0; n < pixelData.NumberOfFrames; n++) + { + var frameData = pixelData.GetFrame(n); + newFragments.Fragments.Add(new MemoryByteBuffer(frameData.Data)); + } + // 替换原有的片段序列 + dicomFile.Dataset.AddOrUpdate(newFragments); } - // 替换原有的片段序列 - dicomFile.Dataset.AddOrUpdate(newFragments); + + #endregion + + await dicomFile.SaveAsync(entryStream); + //await source.CopyToAsync(entryStream, 32 * 1024, abortToken); + } + catch (Exception ex) + { + + Log.Logger.Warning($"处理文件{instance.Path}失败: {ex.Message}"); + } + finally + { + await NotifyProgressAsync(); + } - #endregion - - await dicomFile.SaveAsync(entryStream); - //await source.CopyToAsync(entryStream, 32 * 1024, abortToken); - - - await NotifyProgressAsync(); } } } @@ -1133,6 +1148,9 @@ namespace IRaCIS.Core.API.Controllers var progress = new { + TotalCount = totalCount, + TotalSize = totalSize, + CountPercent = totalCount > 0 ? Math.Round(receivedCount * 100m / totalCount, 2).ToString() : "0", @@ -1192,52 +1210,64 @@ namespace IRaCIS.Core.API.Controllers { foreach (var instance in series.InstanceList) { - //当前完成大小 - receivedSize = receivedSize + instance.FileSize ?? 0; - receivedCount++; - abortToken.ThrowIfCancellationRequested(); - - var entryPath = - $"{visit.SubjectCode}_{visit.VisitName}/{studyTime}_{modalitysStr}/IMAGE/{instance.FileName}"; - - var entry = zip.CreateEntry(entryPath, CompressionLevel.Fastest); - - await using var entryStream = entry.Open(); - await using var source = await _oSSService.GetStreamFromOSSAsync(instance.Path); - - #region 将多帧合并为一帧 - - // 如果你是从 stream 打开 - var dicomFile = await DicomFile.OpenAsync(source); - - // 获取 Pixel Data 标签 - var pixelData = DicomPixelData.Create(dicomFile.Dataset); - //获取像素是否为封装形式 - var syntax = dicomFile.Dataset.InternalTransferSyntax; - - //对于封装像素的文件做转换 - if (syntax.IsEncapsulated) + try { - // 创建一个新的片段序列 - var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); - // 获取每帧数据并封装为单独的片段 - for (int n = 0; n < pixelData.NumberOfFrames; n++) + //当前完成大小 + receivedSize = receivedSize + instance.FileSize ?? 0; + receivedCount++; + + abortToken.ThrowIfCancellationRequested(); + + var entryPath = + $"{visit.SubjectCode}_{visit.VisitName}/{studyTime}_{modalitysStr}/IMAGE/{instance.FileName}"; + + var entry = zip.CreateEntry(entryPath, CompressionLevel.Fastest); + + await using var entryStream = entry.Open(); + await using var source = await _oSSService.GetStreamFromOSSAsync(instance.Path); + + #region 将多帧合并为一帧 + + // 如果你是从 stream 打开 + var dicomFile = await DicomFile.OpenAsync(source); + + // 获取 Pixel Data 标签 + var pixelData = DicomPixelData.Create(dicomFile.Dataset); + //获取像素是否为封装形式 + var syntax = dicomFile.Dataset.InternalTransferSyntax; + + //对于封装像素的文件做转换 + if (syntax.IsEncapsulated) { - var frameData = pixelData.GetFrame(n); - newFragments.Fragments.Add(new MemoryByteBuffer(frameData.Data)); + // 创建一个新的片段序列 + var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); + // 获取每帧数据并封装为单独的片段 + for (int n = 0; n < pixelData.NumberOfFrames; n++) + { + var frameData = pixelData.GetFrame(n); + newFragments.Fragments.Add(new MemoryByteBuffer(frameData.Data)); + } + // 替换原有的片段序列 + dicomFile.Dataset.AddOrUpdate(newFragments); } - // 替换原有的片段序列 - dicomFile.Dataset.AddOrUpdate(newFragments); + + #endregion + + await dicomFile.SaveAsync(entryStream); + //await source.CopyToAsync(entryStream, 32 * 1024, abortToken); + } + catch (Exception ex) + { + + Log.Logger.Warning($"处理文件{instance.Path}失败: {ex.Message}"); + } + finally + { + await NotifyProgressAsync(); + } - #endregion - - await dicomFile.SaveAsync(entryStream); - //await source.CopyToAsync(entryStream, 32 * 1024, abortToken); - - - await NotifyProgressAsync(); } } } @@ -1313,6 +1343,8 @@ ClinicalDataDownloadDTO inCommand) var progress = new { + TotalCount = totalCount, + CountPercent = totalCount > 0 ? Math.Round(receivedCount * 100m / totalCount, 2).ToString() : "0", @@ -1349,7 +1381,7 @@ ClinicalDataDownloadDTO inCommand) //当前完成大小 receivedCount++; - var entryPath =$"{data.FileName}"; + var entryPath = $"{data.FileName}"; var entry = zip.CreateEntry(entryPath, CompressionLevel.Fastest);