下载图片中文乱码问题解决记录

发布时间 2023-12-20 14:58:11作者: 大唐冠军侯

1.问题背景

需求需要做一个场所码下载的需求,后端接口实现使用的是AWT[1]。在本地Windows开发环境联调接口一切正常,当部署到测试环境Linux服务器上之后,前端同事反馈下载的图片如下:

这个问题其实不能算是乱码,而是字体缺失,图片中的汉字使用了微软雅黑字体,而测试环境使用的是docker部署,没有这个字体,下次遇到这种问题,记得首先检查字体文件。

2.排查过程

我这个模块的代码是从其他现有模块的功能中copy过来的,所以我将其他模块下的字体文件全部copy到我的模块下,

然后修改dockerfile重新进行Jenkins部署,

# 照抄加了一行
COPY ./fonts /usr/share/fonts/truetype/dejavu/

然后构建失败了,查询日志报错如下:

Step 10/11 : COPY ./hil-wpms-service/hil-wpms-main/fonts /usr/share/fonts/truetype/dejavu/
COPY failed: stat /var/lib/docker/tmp/docker-builder659582304/hil-wpms-service/hil-wpms-main/fonts: no such file or directory
Build step 'Execute shell' marked build as failure
Finished: FAILURE

很明显找不到这个/fonts文件夹,我首先怀疑的是不是目录写错了,因为我的模块dockerfile/fonts的相对位置和我copy的模块不同,因此我修改了我的dockerfile

COPY ./hil-wpms-service/hil-wpms-main/fonts /usr/share/fonts/truetype/dejavu/

重新进行Jenkins部署,还是失败并且同样的报错,那么就说明不是相对目录错误的问题。
接下来,我又从头看了一遍Jenkins的控制台输出,发现在前面的有一段日志如下:

[203-imedical-hil-wpms] $ /bin/sh -xe /tmp/jenkins7231167455629774297.sh
channel stopped
+ cd /var/lib/jenkins/workspace/203-imedical-hil-wpms/hil-wpms-service/hil-wpms-main/target
+ sudo cp -f hos-hil-wpms-main-1.0.0.RELEASE.jar /usr/local/hil/wpms/main/
+ cd /var/lib/jenkins/workspace/203-imedical-hil-wpms/hil-wpms-service/hil-wpms-main/script/centos/
+ sudo cp -f Dockerfile /usr/local/hil/wpms/main/
+ cd /var/lib/jenkins/workspace/203-imedical-hil-wpms
+ cd /usr/local/hil/wpms/main/
++ date '+%Y-%m-%d %H:%M:%S'
+ echo 2023-12-20 11:57:35 启动docker容器
2023-12-20 11:57:35 启动docker容器
+ docker build -t hil-wpms-main:v1 .
Sending build context to Docker daemon  268.1MB

看起来是将编译完成的jar包和dockerfile复制到指定的目录下,并且最后cd到了指定的目录,那么会不会是我的Jenkins脚本没有复制/fonts呢?对比了成功运行的模块的Jenkins的配置和我的模块的Jenkins的配置,果然是脚本少了一段。
少的一段是在Jenkins的配置的Execute shell中,如下:

cd /var/lib/jenkins/workspace/203-imedical-hil-wpms/hil-wpms-service/hil-wpms-main/
sudo cp -r -f fonts /usr/local/hil/wpms/main/

那么上面那段日志就是执行Jenkins配置的Execute shell的日志,我没有将/fonts复制到/usr/local/hil/wpms/main/下,那么自然在后面的dockerfile执行COPY ./fonts /usr/share/fonts/truetype/dejavu/时会报错no such file or directory

3.问题解决

问题找到,那么将dockerfile的路径改回来,然后再Jenkins的Execute shell中添加复制语句,重新执行Jenkins构建,成功,下载图片正常,

问题解决。

文末注释:


  1. AWT(Abstract Window Toolkit)是 Java 的一个图形用户界面(GUI)工具包。 ↩︎