下载大小和影像数量返回
continuous-integration/drone/push Build is passing Details

Test_HIR_Net8
hang 2025-12-18 09:33:16 +08:00
parent bd9d1a6298
commit efd24ab9ba
1 changed files with 113 additions and 81 deletions

View File

@ -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);