Серверы DICOM, которые передают изображения DICOM через HTTP, должны соответствовать спецификации WADO для извлечения DICOM.
Когда я использую запросы с MultipartDecoder в Requests-toolbelt, я могу успешно получать файлы DICOM с потоковым ответом.
Когда я использую метод потоковой передачи httpx, полученные части являются недействительными DICOM.
К сожалению, мне не удалось найти общедоступный сервер WADO, который помог бы вам проверить это. Надеюсь, вы его найдете.
Как это сделать? Я это исправлю?
Вот код Python для воспроизведения.
В коде каждая часть_ должна представлять собой байты для одного файла DICOM.
Код: Выделить всё
import asyncio
import io
import logging
import httpx
import pydicom
import requests
from requests_toolbelt.multipart import decoder
logger = logging.getLogger(__name__)
async def async_wado(study_instance_uid, wado_request_url, wado_request_header):
with httpx.Client().stream(method="GET", url=wado_request_url, headers=wado_request_header) as response:
for part_ in response.iter_bytes():
dicom_slice_ = pydicom.dcmread(io.BytesIO(part_),)
# InvalidDicomError,Invalid DICOM header metadata or DICM Missing
def sync_wado(study_instance_uid, wado_request_url, wado_request_header):
wado_response = requests.get(wado_request_url, headers=wado_request_header)
mp_data = decoder.MultipartDecoder.from_response(wado_response)
for count, part_ in enumerate(mp_data.parts, start=1):
if 'application/dicom' in part_.headers[b'Content-Type'].decode(encoding='utf-8'):
dicom_slice_ = pydicom.read_file(io.BytesIO(part_.content))
# Works. .dcm file correctly read, can be saved to disk.
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG)
study_instance_uid = ""
wado_request_url = f"https://:/wado-rs/dicom_web/studies/{study_instance_uid}"
wado_request_header = { 'Accept': 'multipart/related; type=application/dicom' }
sync_wado(study_instance_uid, wado_request_url, wado_request_header)
asyncio.run(async_wado(study_instance_uid, wado_request_url, wado_request_header))
Код: Выделить всё
pydicom.errors.InvalidDicomError: File is missing DICOM File Meta Information header or the 'DICM' prefix is missing from the header. Use force=True to force reading.
Подробнее здесь: https://stackoverflow.com/questions/788 ... do-servers