using IRaCIS.Core.Application.Contracts.Dicom; using IRaCIS.Core.Application.Contracts.Dicom.DTO; using IRaCIS.Core.Application.Dicom; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.IO; using System.Net.Http; using System.Threading.Tasks; namespace IRaCIS.Api.Controllers { /// <summary> /// Instance /// </summary> [Route("instance")] [ApiController, Authorize, ApiExplorerSettings(GroupName = "Image")] public class InstanceController : ControllerBase { private readonly IDicomArchiveService _dicomArchiveService; public InstanceController(IDicomArchiveService dicomArchiveService) { _dicomArchiveService = dicomArchiveService; } /// <summary> 指定资源Id,获取Dicom序列所属的实例信息列表 </summary> /// <param name="seriesId"> Dicom序列的Id </param> [HttpGet, Route("list/{seriesId:guid}")] public IEnumerable<DicomInstanceDTO> GetInstanceList(Guid seriesId) { return _dicomArchiveService.GetInstanceList(seriesId); } /// <summary> 指定资源Id,获取Dicom序列所属的实例Id列表 </summary> /// <param name="seriesId"> Dicom序列的Id </param> /// <param name="tpCode"></param> /// <param name="key"></param> [HttpGet, Route("list/id/{seriesId:guid}/{tpCode?}/{key?}")] public IEnumerable<Guid> GetInstanceIdList(Guid seriesId, string tpCode, bool? key) { return _dicomArchiveService.GetInstanceIdList(seriesId, tpCode, key); } /// <summary> 指定资源Id,渲染Dicom实例的Jpeg预览图像 </summary> /// <param name="instanceId"> Dicom实例的Id </param> [HttpGet, Route("preview/{instanceId:guid}")] [AllowAnonymous] public FileContentResult GetInstancePreview(Guid instanceId) { string path = _dicomArchiveService.GetInstancePreview(instanceId); using (var sw = DicomRenderingHelper.RenderPreviewJpeg(path)) { var bytes = new byte[sw.Length]; sw.Read(bytes, 0, bytes.Length); sw.Close(); return new FileContentResult(bytes, "image/jpeg"); } } /// <summary> 指定资源Id,获取Dicom实例文件的内容 </summary> /// <param name="instanceId"> Dicom实例的Id </param> [HttpGet, Route("content/{instanceId:guid}")] [AllowAnonymous] public FileContentResult GetInstanceContent(Guid instanceId) { var filePath = _dicomArchiveService.GetInstanceContent(instanceId); using (var sw = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) { var bytes = new byte[sw.Length]; sw.Read(bytes, 0, bytes.Length); sw.Close(); return new FileContentResult(bytes, "application/octet-stream"); } } } }