Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用户上载/下载文件名允许的字符_Php_Html_Web_Character_Filenames - Fatal编程技术网

Php 用户上载/下载文件名允许的字符

Php 用户上载/下载文件名允许的字符,php,html,web,character,filenames,Php,Html,Web,Character,Filenames,目前用户可以上传他们喜欢的文件。所以在上传的文件中有空格,比如ß,ü等等。其他用户可以下载这些文件(包括URL中的空格等)。它以这种方式工作,但只根据字母数字字符[a-zA-Z0-9]和一些特殊/保留字符。我认为也应该避免使用空的空间 目前,我在服务器上的文件名中获得了一个ßaß。想要下载文件的用户从MySQL数据库(utf8_unicode_ci)获得正确的字符(ß),因此可以在服务器上找到该文件 处理文件名的正确方法是什么 我应该检查文件名并禁止上传吗 用户上传后,我是否应该重命名服务器

目前用户可以上传他们喜欢的文件。所以在上传的文件中有空格,比如
ß,ü
等等。其他用户可以下载这些文件(包括URL中的空格等)。它以这种方式工作,但只根据字母数字字符
[a-zA-Z0-9]
和一些特殊/保留字符。我认为也应该避免使用空的空间

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

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

你似乎已经在处理它们了;将文件名包装在
rawurlencode
中,然后再将其放入URL参数中,以符合规范

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

不,那只会让你的用户恼火

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

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


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

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

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

如果您打算通过PHP为文件提供
内容处置
标题,则应仅允许在文件名中使用以下字符:

a-z, A-Z, 0-9, _, - , .
这是因为该标头没有适用于US-ASCII可打印范围以外字符的工作规范


通常,上传文件时,文件名会被规范化。在上传时做一些验证/消毒也是明智的。

你说的“你似乎已经在处理它们”是什么意思?我只将它们移动到另一个位置,并将原始文件名保存在数据库中。内容配置是否适用于所有浏览器?是否应通知用户仅使用字母数字字符?随机名称的产生对搜索引擎优化有不利影响吗?当前的情况何时会导致问题(它起作用,但为什么)?我如何找到“文件系统上的编码以及文件系统是否与您用于上传文件名的字符集兼容”?是的,应该使用UTF-8。Web服务器为Apache,数据库服务器为MySQL 5.0.77,连接设置为
set NAMES utf8
,浏览器可以是任何人,通过
POST
multipart/form data
上传,HTML编码为
UTF-8
。在Firebug中,提供HTTP HTML响应的文件链接具有
内容类型应用程序/x-www-form-urlencoded
,但我从未做过任何事情(默认值?)。因此
内容处置
将不是我想要的。如何对文件名进行规范化和验证?@testing:您可以通过字符串处理自己完成这项工作。但我应该替换哪些字符?每种语言都有自己的字符,我不想把它们全部替换掉。那么是否有一个标准的集合/功能?或者是允许
a-z,a-z,0-9,,
方法?@testing:在上传文件时,首先要将文件名
rawurlencode
以这种方式存储在磁盘和数据库中。然后,当输出时,由于它是一个带有特殊字符的URL,您需要再次对其进行
rawurlencode
。当心。