oss-天然不支持真流式上传,除非大文件在本地盘,否则会占用内存
continuous-integration/drone/push Build is passing Details

Uat_IRC_Net8
hang 2025-12-18 15:37:36 +08:00
parent 9268aa5bc4
commit dcfb523b87
2 changed files with 59 additions and 26 deletions

View File

@ -912,7 +912,7 @@ public class OSSService : IOSSService
} }
/// <summary> /// <summary>
/// 删除某个目录的文件 /// 删除某个目录的文件 (包含单个文件oss单个文件需要去除前缀/)
/// </summary> /// </summary>
/// <param name="prefix"></param> /// <param name="prefix"></param>
/// <returns></returns> /// <returns></returns>

View File

@ -75,8 +75,8 @@ namespace IRaCIS.Core.Application.Service
{ {
public static int IntValue = 100; public static int IntValue = 100;
[AllowAnonymous]
public async Task<IResponseOutput> DealIVUSOCTDicomTag(string subjectCode, bool isUploadOss) public async Task<IResponseOutput> DealIVUSOCTDicomTag(string subjectCode, bool? isUploadOss)
{ {
var trialId = Guid.Parse("01000000-AC13-0242-3AE4-08DC9B0495C6"); var trialId = Guid.Parse("01000000-AC13-0242-3AE4-08DC9B0495C6");
@ -85,39 +85,47 @@ namespace IRaCIS.Core.Application.Service
//var subjectCodeList = new List<string>() { "04032", "12004", "04005" }; //var subjectCodeList = new List<string>() { "04032", "12004", "04005" };
var list = await _dicomInstanceRepository.Where(t => t.TrialId == trialId && t.DicomStudy.SubjectVisit.IsBaseLine) var list = await _dicomInstanceRepository.Where(t => t.TrialId == trialId && t.DicomStudy.SubjectVisit.IsBaseLine)
.Where(t => t.DicomStudy.Subject.Code== subjectCode) .Where(t => t.DicomStudy.Subject.Code == subjectCode)
.WhereIf(subjectCode == "04032", t => t.DicomStudy.ModalityForEdit == "OCT") .WhereIf(subjectCode == "04032", t => t.DicomStudy.ModalityForEdit == "OCT")
.WhereIf(subjectCode == "12004", t => t.DicomStudy.ModalityForEdit == "IVUS") .WhereIf(subjectCode == "12004", t => t.DicomStudy.ModalityForEdit == "IVUS")
.WhereIf(subjectCode == "04005 ", t => t.DicomStudy.ModalityForEdit == "IVUS" || t.DicomStudy.ModalityForEdit == "OCT") .WhereIf(subjectCode == "04004", t => t.DicomStudy.ModalityForEdit == "IVUS" || t.DicomStudy.ModalityForEdit == "OCT")
.WhereIf(subjectCode == "04005", t => t.DicomStudy.ModalityForEdit == "IVUS" || t.DicomStudy.ModalityForEdit == "OCT")
.Select(t => new .Select(t => new
{ {
SubjectCode = t.DicomStudy.Subject.Code, SubjectCode = t.DicomStudy.Subject.Code,
t.DicomStudy.ModalityForEdit, t.DicomStudy.ModalityForEdit,
t.Path t.Path,
t.FileSize
}).ToListAsync(); }).ToListAsync();
foreach (var item in list) foreach (var item in list)
{ {
Console.WriteLine(item.Path);
var stream = await _IOSSService.GetStreamFromOSSAsync(item.Path); await using var stream = await _IOSSService.GetStreamFromOSSAsync(item.Path);
var dicomFile = DicomFile.Open(stream); var dicomFile = DicomFile.Open(stream, FileReadOption.ReadLargeOnDemand);
switch (item.SubjectCode) switch (item.SubjectCode)
{ {
case "04032": case "04032":
dicomFile.Dataset.AddOrUpdate(DicomTag.PatientID, $"{trialCode}_04032"); dicomFile.Dataset.AddOrUpdate(DicomTag.PatientID, $"{trialCode}-04032");
dicomFile.Dataset.AddOrUpdate(DicomTag.ClinicalTrialSubjectID, "04032"); dicomFile.Dataset.AddOrUpdate(DicomTag.ClinicalTrialSubjectID, "04032");
break; break;
case "12004": case "12004":
dicomFile.Dataset.AddOrUpdate(DicomTag.PatientID, $"{trialCode}_12004"); dicomFile.Dataset.AddOrUpdate(DicomTag.PatientID, $"{trialCode}-12004");
dicomFile.Dataset.AddOrUpdate(DicomTag.ClinicalTrialSubjectID, "12004"); dicomFile.Dataset.AddOrUpdate(DicomTag.ClinicalTrialSubjectID, "12004");
break; break;
case "04004":
dicomFile.Dataset.AddOrUpdate(DicomTag.PatientID, $"{trialCode}-04004");
dicomFile.Dataset.AddOrUpdate(DicomTag.ClinicalTrialSubjectID, "04004");
break;
case "04005": case "04005":
dicomFile.Dataset.AddOrUpdate(DicomTag.PatientID, $"{trialCode}_04005"); dicomFile.Dataset.AddOrUpdate(DicomTag.PatientID, $"{trialCode}-04005");
dicomFile.Dataset.AddOrUpdate(DicomTag.ClinicalTrialSubjectID, "04005"); dicomFile.Dataset.AddOrUpdate(DicomTag.ClinicalTrialSubjectID, "04005");
break; break;
@ -131,28 +139,53 @@ namespace IRaCIS.Core.Application.Service
var fileName = Path.GetFileName(item.Path); var fileName = Path.GetFileName(item.Path);
// 4 保存到一个 MemoryStream
await using var output = new MemoryStream();
dicomFile.Save(output);
output.Position = 0;
if (isUploadOss == false) //if (isUploadOss == false)
//{
// // 本地完整路径
// var localPath = Path.Combine(Directory.GetCurrentDirectory(), fileName);
// // 写入文件
// await using var fileStream = File.Create(localPath);
// await output.CopyToAsync(fileStream);
// // 可选:确保写入完成再关闭
// await fileStream.FlushAsync();
//}
//else
if (isUploadOss == true)
{ {
// 本地完整路径 //4 保存到一个 MemoryStream
var localPath = Path.Combine(Directory.GetCurrentDirectory(), fileName); await using var output = new MemoryStream();
dicomFile.Save(output);
output.Position = 0;
// 写入文件
await using var fileStream = File.Create(localPath);
await output.CopyToAsync(fileStream);
// 可选:确保写入完成再关闭
await fileStream.FlushAsync();
}
else
{
await _IOSSService.UploadToOSSAsync(output, folder, fileName, false); await _IOSSService.UploadToOSSAsync(output, folder, fileName, false);
//var pipe = new System.IO.Pipelines.Pipe();
//// 写入端fo-dicom
//_ = Task.Run(async () =>
//{
// try
// {
// await using var writer = pipe.Writer.AsStream();
// dicomFile.Save(writer); // 直接写 Pipe
// await pipe.Writer.CompleteAsync();
// }
// catch (Exception ex)
// {
// await pipe.Writer.CompleteAsync(ex);
// }
//});
////await _IOSSService.UploadToOSSAsync(pipe.Reader.AsStream(), folder, fileName, false);
await _IOSSService.DeleteFromPrefix(item.Path.TrimStart("/"), true);
} }
} }