我们运行一个用户上传图像文件的网站。当这些文件在mac上生成时,有时它们的文件名中包含utf-8字符(因为mac使用utf-8作为其文件系统字符集)。
当php7代码接收到这些文件时,我们必须将它们存储在本地文件系统中,该文件系统是debian linux,不支持utf-8。
另外,虽然php7可以支持utf-8,但它不支持本机或自动执行。
所以,问题是:目前处理这个问题的最佳做法是什么?
想法1:
在数据库中保存原始名称(排序规则= utf8mb4_unicode_ci
? ), 然后使用uuid将图像存储在磁盘上。然后,使用 download=""
将文件下载为原始文件名。
赞成:似乎解决了问题。
缺点:在php中,多字节支持似乎很笨拙(甚至在7.2.x+中也是如此)。这需要大量的支票来处理吗?
想法二:
清理/过滤掉文件名中的utf-8字符,以完全避免问题。
赞成:我可以像往常一样在mysql/mariadb中使用拉丁文排序规则,而且我不必担心文件系统字符集。
缺点:这是有损的。一个名为 touche'.pdf
将被重命名 touch.pdf
或者我必须创建一些等价表 e'
进入 e
.
思想3
我已经考虑过这个问题,或者我错过了一个简单的解决办法。
处理上传的utf-8/多字节文件名的最佳方法是什么?
1条答案
按热度按时间izj3ouym1#
考虑php的
urlencode()
将utf-8字符转换为%加十六进制。我可能更喜欢简单的申请
urlencode
对于每个条目--纯ascii格式的名称将保持不变。我不认为%
会引起麻烦的。其他标点符号可能会引起麻烦(例如/
).