68 lines
3.2 KiB
Markdown
68 lines
3.2 KiB
Markdown
# 腾讯 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 部署时必须挂载持久化卷。
|
||
|
||
服务启动时会主动创建并检查该目录是否可读写。启动日志中应出现:
|
||
|
||
```text
|
||
腾讯 IM 图片归档目录已就绪,/opt/apps/private-files/im-chat
|
||
```
|
||
|
||
如果日志中出现 `EACCES`,需要给实际运行 Node/PM2 的 Linux 用户授予该目录的
|
||
读写权限。
|
||
|
||
归档成功后可通过下面的接口读取图片:
|
||
|
||
```text
|
||
GET /im-chat/image/:msgId
|
||
```
|
||
|
||
当前接口按需求暂未启用 JWT,但仅允许通过 `MsgId` 查询数据库中归档成功的受控路径。
|
||
生产使用前建议补充问诊订单权限验证。
|
||
## 处方 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`。
|