我应该为文件名转义/清理哪些字符?

时间:2009-06-26 00:00:13

标签: php

我需要清理一些将在文件名中使用的数据。某些数据包含空格和符号字符。是否有一个函数可以转义或清理适合在文件名(或路径)中使用的数据?我在PHP手册的“文件系统功能”部分找不到一个。

所以,假设我必须编写自己的函数,我需要转义(或更改)哪些字符?

7 个答案:

答案 0 :(得分:10)

对于Windows:

/ \ : * ? " < > |

对于Unix,技术上没什么,但在实践中,与Windows相同的列表是明智的。

只要您准备在操作文件时在命令行上使用引号,空格或&符号就没有错。

(顺便说一句,我通过尝试将Windows上的文件重命名为冒号并从错误消息中复制来获取该列表。)

答案 1 :(得分:5)

为什么不只是允许[a-z0-9- !@#$%^()]而不是过滤字符?这比猜测每个可能导致问题的角色更容易。

您的用户不应该需要包含任何其他字符的文件,对吧?

答案 2 :(得分:5)

如果您有机会将原始名称存储在数据库中,我只需创建一个带有随机哈希的文件(mt_rand()/ md5 / sha1)。好处是您不依赖于底层操作系统(字符/路径长度),用户输入的值或长度,而且很难猜测/伪造文件名。也许甚至可以选择base64编码。

答案 3 :(得分:3)

删除[a-z0-9 _ \ - 。]之外的所有内容可能是个好主意。没有必要这么严格,但是有一个目录列表没有任何意外,这很舒服。如果您正在处理一些奇怪的字符集,那么您可能希望在删除有问题的字符之前将编码转换为平面ascii(或者您最终可能会删除所有内容) ......

至少我是这样做的: - )

答案 4 :(得分:2)

在清理文件名的字符串时,我们会过滤掉0x20以下的所有字符,以及&lt;,&gt;,:,“,/,\,|,?和*

答案 5 :(得分:2)

对于Windows,添加“&amp;”如果您不想要任何副作用,请到列表中。这是在某些数据显示中表示“下一个字符是我的热键”的字符。 (在旧的Windows中最常见,但仍会在这里和那里弹出。)因此,而不是“M&amp; M”,你会看到“M _M”......&符号后面的字符(空格)是“热键” ,并因此加下划线。

答案 6 :(得分:0)

@merkuro answer的实施:

function getSafeFilesystemFileName() {
    return (
        md5($id . '-' . $filename) .
        '.' . pathinfo($filename, PATHINFO_EXTENSION)
    );
}

其中:

  • $id是数据库中的记录ID
  • $filename是原始上传的文件名(也存储在记录中)

一件重要的事情:将原始扩展名附加到生成的文件上。如果您需要将文件提供给关注扩展的工具,那么让它可用起来要比创建带扩展名的临时文件要容易得多。