0、问题描述

遇到了一个很奇怪的问题,微信发朋友圈,选择相册中的图片,识别不出来,发送提示失败。

图片是通过手机客户端生成后,保存在本地相册的。Android手机有这个问题,iOS没有。

Android保存逻辑:

0.0、传递给客户端的如果是url,客户端会获取url中的文件名,然后保存在本地。

0.1、传递给客户端的如果没有文件名,比如是base64格式的图片,客户端会生成一个文件名。

iOS保存逻辑:

0.2、客户端不管什么情况都会通过md5加密生成文件名,是系统本身的功能。(据说传了文件名对文件名md5, 没传文件名会有系统默认的算法)

1、问题排查

后来知道是Android下保存图片的文件名使用的是当前时间戳(prefix_yyyy-MM-dd_HH:mm:ss), 然后带有冒号,相册中能查看,但是微信中找不到。「多亏了一个同事发现了这个问题,开始排查是图片本身的问题」

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
File f = new File(Environment.getExternalStorageDirectory() + "/" + Environment
.DIRECTORY_DCIM + "/prefix" + simpleDateFormat.format(new Date()) + ".jpg");

2、问题解决

不使用这种方式命名即可。推荐iOS下md5加密的方式。

3、思考,为什么文件名不能包含冒号?

没有找到权威的说法,以下信息仅供参考

3.0、Windows系统下冒号用于指定盘符的,比如 C:\

3.1、冒号在系统里的作用是路径分隔符,属于系统保留字符,所以不能拿来作为文件名使用

3.2、不只:,还有/\〈〉”等。这些符号叫通配符,其实是从DOS中来的,代表了文件路径、命令的格式。如果在文件名中出现这些符号,那将在定位、检索、执行文件时发生系统错乱。

3.3、部分Android系统中文件名出现:会报错,有些不会。

4、小结:

4.0、解决该问题最正确的方向,图片在相册中能查看,那么图片本身没问题,微信在选择后找不到,应该联想到图片路径的问题,而不是推测图片过大

4.1、Android系统和MacOS系统文件名不能是冒号、问号、反斜杠。[Mac上建文件含以上字符提示失败]

4.2、Centos上文件名可以带冒号

[root@izj6cfhaw27k49x8usszs3z ~]# touch 2019_09_07_11:25:44.log
[root@izj6cfhaw27k49x8usszs3z ~]# ll
total 4
-rw-r--r-- 1 root root 5 Sep 7 11:30 2019_09_07_11:25:44.log
[root@izj6cfhaw27k49x8usszs3z ~]# vim 2019_09_07_11\:25\:44.log

4.2、Android可以查看手机文件中的文件名并修改,iOS不能查看(所以也不能修改)

5、最后

你说这个问题很难吗,不见得。如果你没有这个知识(常识)问题就会很难,这其实就是计算机科学的规则而已啊,多在这个世界行走,多触碰规则,无他,熟悉就好。