我需要清理一些将在文件名中使用的数据。某些数据包含空格和符号字符。是否有一个函数可以转义或清理适合在文件名(或路径)中使用的数据?我在PHP手册的“文件系统功能”部分找不到一个。
所以,假设我必须编写自己的函数,我需要转义(或更改)哪些字符?
答案 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
是原始上传的文件名(也存储在记录中)一件重要的事情:将原始扩展名附加到生成的文件上。如果您需要将文件提供给关注扩展的工具,那么让它可用起来要比创建带扩展名的临时文件要容易得多。