目前,用户可以根据需要上传文件。所以在上传的文件中有空格,如ß, ü
等字符。比其他用户可以下载这些文件(包括URL中的空格等)。它以这种方式工作,但根据RFC1738 - Uniform Resource Locators (URL),只允许使用字母数字字符[a-zA-Z0-9]
和一些特殊/保留字符。我想也应该避免空格。
目前,我在服务器上的文件名中找到了ß
ß
。想要下载文件的用户获取MySQL数据库(utf8_unicode_ci)中表示的正确字符(ß),因此可以在服务器上找到该文件。
str_replace()
,urlencode()
,...)?答案 0 :(得分:1)
处理文件名的正确方法是什么?
你似乎已经在处理它们了;将文件名包装在rawurlencode
中,然后将它们放入URL参数中,以便符合规范。
我应该检查文件名并禁止上传吗?
不,这只会惹恼您的用户。
我应该在用户上传后重命名服务器上的文件吗?
这可能是一个好主意。您可以使用您选择的技术生成“随机”名称,并将“原始”名称保存在数据库中。每当用户想要下载文件时,请使用他们用于通过Content-Disposition
HTTP标头上传文件的名称将文件返回给他们。
这样做的好处包括确保您不会被每个用户的文件系统与服务器的文件系统之间的细微差别所困扰,并避免重复的文件名问题。
答案 1 :(得分:1)
只要您的网络服务器负责处理文件下载,请确保它知道文件系统上的编码,并且文件系统与您用于上传的文件名的字符集兼容
只要这里的所有内容都兼容(看起来你使用的是UTF-8),你就不会遇到任何问题。只需确保编码设置在您使用的每个位置(文件系统,网络服务器,数据库服务器,数据库客户端连接,浏览器,上传POST请求,提供文件链接的HTTP HTML响应等)。
如果您打算使用Content-Disposition
标头通过PHP提供文件,则应该只允许文件名中的followinig字符:
a-z, A-Z, 0-9, _, - , .
这是因为该标题没有US-ASCII可打印范围之外的字符的工作规范。
通常在上传文件时,它的文件名得到规范化。在上传时进行一些验证/消毒也是明智的。