腾讯 IM 图片本地归档
腾讯 IM 的图片消息在 /IMCallBack 入库后,会异步下载 TIMImageElem
中的 Type=1 原图并保存到服务器私有目录。归档状态保存在
Internet-hospital.im-chat-msg.imageArchive。
可选环境变量:
# 建议在生产环境显式配置为代码目录之外、具备持久化和备份的绝对路径
CONFIG_IM_IMAGE_ROOT=/data/hn-private-files/im-chat
# 默认 30MB
CONFIG_IM_IMAGE_MAX_BYTES=31457280
# 逗号分隔的腾讯图片域名后缀
CONFIG_IM_IMAGE_ALLOWED_HOSTS=.my-imcloud.com,.im.qcloud.com,.myqcloud.com
未设置 CONFIG_IM_IMAGE_ROOT 时,路径规则与现有 /upload 一致:以服务入口
目录为基准,保存到 ../private-files/im-chat。例如:
- 源码从
hn-hlw-service/index.js运行时,保存到项目组目录下的private-files/im-chat,与现有upload-files同级。 - bundle 位于
/opt/apps/hnhlw/bundle_xx.js时,保存到/opt/apps/private-files/im-chat,与/opt/apps/upload-files同级。
private-files 不会通过 Express 静态目录公开。该目录不能在发布时被清理;
Docker 部署时必须挂载持久化卷。
服务启动时会主动创建并检查该目录是否可读写。启动日志中应出现:
腾讯 IM 图片归档目录已就绪,/opt/apps/private-files/im-chat
如果日志中出现 EACCES,需要给实际运行 Node/PM2 的 Linux 用户授予该目录的
读写权限。
归档成功后可通过下面的接口读取图片:
GET /im-chat/image/:msgId
当前接口按需求暂未启用 JWT,但仅允许通过 MsgId 查询数据库中归档成功的受控路径。
生产使用前建议补充问诊订单权限验证。
处方 PDF
处方笺下载接口为 GET /hlw/prescriptions/:id/pdf;默认输出 A5,传 paperSize=A4 可输出 A4。
服务运行环境需要预装 Chromium/Chrome,并配置其可执行文件路径:
PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium
PRESCRIPTION_PDF_MAX_CONCURRENCY=2
# 推荐挂载到持久化卷;未设置时默认 ../private-files/prescriptions
CONFIG_PRESCRIPTION_PDF_ROOT=/data/hn-private-files/prescriptions
PRESCRIPTION_PDF_MAX_CONCURRENCY 默认为 2,用于限制 Chromium 同时渲染的页面数。首次访问会生成并原子写入持久化目录,之后同一处方和纸张规格直接读取已有文件。该链接当前不需要认证。医生和药师签名支持 data:image/*;base64,...、项目上传目录的 /upload-files/*.png|jpg|jpeg|webp 路径,或 HTTP(S) 图片 URL。按本地文件、网络下载、姓名文本的顺序回退;网络请求最长 5 秒、最大 1 MB。
PDF 响应使用 Cache-Control: no-cache,浏览器每次访问都会向服务端校验文件;已保存的 PDF 仍直接从磁盘读取,不会重复渲染。
PDF 按处方 ObjectId 的 UTC 创建日期分目录保存,例如 /opt/apps/private-files/prescriptions/2026/09/15/{处方ID}-A5-v5.pdf,避免大量文件堆积在同一个目录。
Linux 服务端需安装中文字体,否则 Chrome 无法渲染处方中的中文。TencentOS Server 4 可执行 dnf install -y google-noto-sans-cjk-sc-fonts fontconfig && fc-cache -f,模板会优先使用 Noto Sans CJK SC。