如何在fo-dicom的C-STORE SCP中读取远程AE发送的原始DICOM文件名?
解决fo-dicom C-STORE SCP获取原始文件名的问题
首先明确:DICOM C-STORE协议本身不传输原始文件名,它传输的是DICOM数据集内容,文件名属于发送端本地文件的属性,不会默认随C-STORE请求发送。你要获取原始文件名,只有两种可行路径:
- 发送端主动将文件名嵌入到DICOM数据集的某个标签(标准标签或厂商私有标签)中
- 若发送端使用DICOM文件系统相关协议(如C-GET),但你当前用的是C-STORE,此路径不适用
针对你的fo-dicom代码,调整方案如下:
1. 确认发送端是否嵌入了文件名
先和发送端的运维或开发确认:他们是否将原始文件名存入了某个DICOM标签?比如部分厂商会用私有标签,或复用一些非核心标准标签(仅为示例,需以实际为准)。
2. 在SCP中读取对应标签值
如果发送端确实嵌入了文件名,在OnCStoreRequestAsync方法中,从request.Dataset或request.File.FileMetaInfo中读取对应标签:
public async Task<DicomCStoreResponse> OnCStoreRequestAsync(DicomCStoreRequest request) { string originalFileName = null; // 示例:替换为发送端实际存储文件名的标签 var targetTag = new DicomTag(0x00XX, 0xXXXX); if (request.Dataset.Contains(targetTag)) { originalFileName = request.Dataset.GetString(targetTag); } // 若文件名存在于File Meta信息中,可从FileMetaInfo读取 else if (request.File?.FileMetaInfo != null && request.File.FileMetaInfo.Contains(targetTag)) { originalFileName = request.File.FileMetaInfo.GetString(targetTag); } // 后续逻辑:结合原始文件名和你原有的标签生成逻辑处理保存 // 比如:var saveFileName = $"{originalFileName}_{request.Dataset.GetString(DicomTag.SOPInstanceUID)}.dcm"; return new DicomCStoreResponse(DicomStatus.Success); }
3. 若发送端未嵌入文件名
这种情况下你无法获取到原始文件名,只能继续使用现有逻辑(通过DICOM标签如SOP Instance UID生成文件名),或者联系发送端修改配置,将文件名嵌入到指定标签中。
内容的提问来源于stack exchange,提问作者efarook
相关产品推荐
相关产品推荐

