【问题标题】:In PHP7, what's the best way to sanitize UTF8 character containing filenames?在 PHP7 中,清理包含文件名的 UTF8 字符的最佳方法是什么?
【发布时间】:2019-01-24 19:31:39
【问题描述】:

我们经营一个用户上传图片文件的网站。在 Mac 上生成这些文件时,有时它们的文件名中有 UTF-8 字符(因为 mac 使用 UTF-8 作为其文件系统字符集)。

当 PHP7 代码接收到这些文件时,我们必须将它们存储在本地文件系统中,即 Debian Linux,不支持 UTF-8。

另外,虽然 PHP7 可以支持 UTF-8,但它本身并不能自动支持。

所以,问题是:目前处理此问题的最佳做法是什么?

想法1

将原始名称保存在数据库中 (Collat​​ion = utf8mb4_unicode_ci? ),然后使用 UUID 将图像存储在磁盘上。然后,使用download="" 将文件下载为原始文件名。

专业版:好像解决了问题。

Con:多字节支持在 PHP 中似乎很笨拙(甚至在 7.2.x+ 中)。这是否需要大量检查才能处理它?

想法2

清理/过滤掉文件名中的 UTF-8 字符,以完全避免该问题。

专业人士:我可以像往常一样在 MySQL/MariaDB 中使用拉丁排序规则,而且我不必担心文件系统字符集。

Con:这是有损的。一个名为touche'.pdf 的文件将被重命名为touch.pdf 或者我必须创建一些等效表来将e' 转换为e

思想3

我想多了这个问题,或者我错过了一个简单的解决方案。

处理上传的 UTF-8 / 多字节文件名的最佳方法是什么?

【问题讨论】:

  • PHP 有一组丰富的Multibye String 处理选项,也许mb-convert-encoding 函数会有所帮助。
  • 对于数据库端,使用CHARSET utf8mb4,排序规则只是顺序。尝试在本地处理它。似乎是一些 OSX utf8 文件系统讨论stackoverflow.com/questions/6153345/…
  • 似乎我对上面的两个想法都有答案。似乎我可以使用mb_detect_encoding 来确定如何处理字符,然后使用mb_convert_encoding 来转换它,或者使用UUID 解决方案和utf8mb4,两者都可以工作。似乎后者将为我提供最“通用”的解决方案(如果有人将表情符号放在文件名中怎么办?)。所以,除非我们有令人信服的理由不这样做,否则我现在就这样做。如果有人想把它放在那里,我需要一个答案来接受/关闭这个问题......
  • 毫无疑问,解决方案 1 是最好的。不确定您对 PHP 的多字节支持有什么顾虑。

标签: mysql utf-8 mariadb php-7 utf8mb4


【解决方案1】:

考虑 PHP 的 urlencode() 将 UTF-8 字符转换为 % 加十六进制。

fn        'smiley-☺'
urlencode 'smiley-%E2%98%BA'
bin2hex   '736d696c65792de298ba'

我可能更喜欢简单地将urlencode 应用于每个条目——纯ascii 中的名称将保持不变。而且我认为% 不会造成麻烦。其他标点符号可能会引起麻烦(例如/)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-15
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多