0

目前用户可以随意上传文件。所以在上传的文件中有空格,字符之类ß, ü的。比其他用户可以下载这些文件(包括 URL 中的空格等)。它以这种方式工作,但根据RFC1738 - 统一资源定位符 (URL) ,只允许使用字母数字字符[a-zA-Z0-9]和一些特殊/保留字符。我认为也应该避免空白。

目前我在服务器上的文件名中得到一个ßa ß。想要下载文件的用户从 MySQL 数据库 (utf8_unicode_ci) 中获取正确的字符 (ß),因此可以在服务器上找到该文件。

  • 处理文件名的正确方法是什么?
  • 我应该进行文件名检查并禁止上传吗?
  • 我应该在用户上传后重命名服务器上的文件(例如str_replace(),,urlencode()...)吗?
4

2 回答 2

1

只要您的网络服务器负责处理文件下载,请确保它知道文件系统上的编码,并且文件系统与您用于处理的上传文件名的字符集兼容。

只要这里的一切都兼容(看起来你使用的是 UTF-8),你就不会遇到任何问题。只需确保在您使用的每个地方(文件系统、网络服务器、数据库服务器、数据库客户端连接、浏览器、上传 POST 请求、提供 HTTP HTML 响应的文件链接等)都正确设置了编码。

如果您打算通过 PHP 提供带有Content-Disposition标头的文件,您应该只允许在文件名中包含以下字符:

a-z, A-Z, 0-9, _, - , .

这是因为该标头没有针对 US-ASCII 可打印范围之外的字符的工作规范。

通常当一个文件被上传时,它的文件名被规范化了。在上传时进行一些验证/清理也是明智之举。

于 2012-04-17T11:28:14.510 回答
1

处理文件名的正确方法是什么?

您似乎已经在处理它们了;在将文件名放入 URL 参数之前将它们包装起来rawurlencode以符合规范。

我应该进行文件名检查并禁止上传吗?

不,那只会惹恼您的用户。

用户上传后我应该重命名服务器上的文件吗?

这可能是个好主意。您可以使用您选择的技术生成一个“随机”名称,并将“原始”名称保存在数据库中。每当用户想要下载文件时,使用他们通过Content-DispositionHTTP 标头上传文件时使用的名称将其返回给他们。

这样做的好处包括确保您不会被每个用户的文件系统和服务器文件系统之间的细微差异所困扰,并避免重复文件名问题。

于 2012-04-17T11:04:13.467 回答