查询接口返回的本地地址访问403错误:http://localhost:8080/api/dicom/viewer/INST002/864fdcb2de4a42fca208d7439480e913.dcm
文件位置: DicomController.java:263-338
接口路径: GET /api/dicom/viewer/{institutionId}/{fileName}
功能说明:
文件位置: StudyQueryServiceImpl.java:255-290
工作原理:
file_path 提取机构ID和文件名http://localhost:8080/api/dicom/viewer/{institutionId}/{fileName}文件位置: DicomController.java:308-338
查找策略:
基础路径: ~/qconline/dicom/{institutionId}/
搜索范围: 所有日期子目录
查找匹配: 文件名完全匹配
示例:
请求URL: /api/dicom/viewer/INST002/864fdcb2de4a42fca208d7439480e913.dcm
搜索路径:
- ~/qconline/dicom/INST002/2025-12-29/864fdcb2de4a42fca208d7439480e913.dcm
- ~/qconline/dicom/INST002/2025-12-30/864fdcb2de4a42fca208d7439480e913.dcm
- ... (其他日期目录)
需要在SecurityConfig中添加:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
// DICOM文件访问接口允许访问(根据实际情况调整权限)
.antMatchers("/api/dicom/viewer/**").permitAll()
// 或者需要认证
// .antMatchers("/api/dicom/viewer/**").authenticated()
.and()
// ... 其他配置
}
确保DICOM文件目录具有正确的读取权限:
# 检查目录权限
ls -la ~/qconline/dicom/
# 如果权限不足,修改权限
chmod -R 755 ~/qconline/dicom/
# 直接访问文件
curl -I http://localhost:8080/api/dicom/viewer/INST002/864fdcb2de4a42fca208d7439480e913.dcm
# 下载文件
curl -o test.dcm http://localhost:8080/api/dicom/viewer/INST002/864fdcb2de4a42fca208d7439480e913.dcm
curl -X GET "http://localhost:8080/api/dicom/query?study_instance_uid={uid}&institution_id=INST002"
检查返回的 instances[].url 是否可以访问。
直接在浏览器中访问URL,应该会提示下载DICOM文件。
原因:
解决方案:
原因:
解决方案:
file_path 字段存储的路径格式正确原因:
解决方案:
// 在Controller中添加URL解码
String decodedFileName = java.net.URLDecoder.decode(fileName, StandardCharsets.UTF_8);
可以使用Spring Cache或Redis缓存频繁访问的文件:
@Cacheable(value = "dicomFiles", key = "#institutionId + ':' + #fileName")
public byte[] getDicomFile(String institutionId, String fileName) {
// ...
}
对于生产环境,建议:
记录文件访问情况,便于监控和分析:
log.info("DICOM文件访问: institutionId={}, fileName={}, size={}, ip={}",
institutionId, fileName, file.length(), request.getRemoteAddr());
如果需要使用其他地址(如域名),修改 StudyQueryServiceImpl.java:282:
// 原配置
return String.format("http://localhost:8080/api/dicom/viewer/%s/%s", institutionId, fileName);
// 修改为(使用配置文件)
@Value("${dicom.viewer.base-url:http://localhost:8080}")
private String viewerBaseUrl;
return String.format("%s/api/dicom/viewer/%s/%s", viewerBaseUrl, institutionId, fileName);
修改 DicomController.java:293:
// 当前:缓存1小时
response.setHeader("Cache-Control", "max-age=3600");
// 修改为:缓存24小时
response.setHeader("Cache-Control", "max-age=86400");
完成以上配置后,DICOM文件访问流程:
~/qconline/dicom/{institutionId}/{date}/{fileId}.dcmseries_info.file_path/api/dicom/viewer/{institutionId}/{fileName} 访问现在应该可以正常访问DICOM文件了!