2026-08-25 17:03:56 +08:00
|
|
|
|
# 腾讯 IM 图片本地归档
|
|
|
|
|
|
|
|
|
|
|
|
腾讯 IM 的图片消息在 `/IMCallBack` 入库后,会异步下载 `TIMImageElem`
|
|
|
|
|
|
中的 `Type=1` 原图并保存到服务器私有目录。归档状态保存在
|
|
|
|
|
|
`Internet-hospital.im-chat-msg.imageArchive`。
|
|
|
|
|
|
|
|
|
|
|
|
可选环境变量:
|
|
|
|
|
|
|
|
|
|
|
|
```ini
|
|
|
|
|
|
# 建议在生产环境显式配置为代码目录之外、具备持久化和备份的绝对路径
|
|
|
|
|
|
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 部署时必须挂载持久化卷。
|
|
|
|
|
|
|
2026-08-25 18:43:04 +08:00
|
|
|
|
服务启动时会主动创建并检查该目录是否可读写。启动日志中应出现:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
腾讯 IM 图片归档目录已就绪,/opt/apps/private-files/im-chat
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
如果日志中出现 `EACCES`,需要给实际运行 Node/PM2 的 Linux 用户授予该目录的
|
|
|
|
|
|
读写权限。
|
|
|
|
|
|
|
2026-08-25 17:03:56 +08:00
|
|
|
|
归档成功后可通过下面的接口读取图片:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
GET /im-chat/image/:msgId
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
当前接口按需求暂未启用 JWT,但仅允许通过 `MsgId` 查询数据库中归档成功的受控路径。
|
|
|
|
|
|
生产使用前建议补充问诊订单权限验证。
|
2026-09-15 13:44:07 +08:00
|
|
|
|
## 处方 PDF
|
|
|
|
|
|
|
|
|
|
|
|
处方笺下载接口为 `GET /hlw/prescriptions/:id/pdf`;默认输出 A5,传 `paperSize=A4` 可输出 A4。
|
|
|
|
|
|
|
|
|
|
|
|
服务运行环境需要预装 Chromium/Chrome,并配置其可执行文件路径:
|
|
|
|
|
|
|
|
|
|
|
|
```env
|
|
|
|
|
|
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`。
|