PHP文件上传 - 处理阿拉伯语/中文/日语文件名

3

我有一个系统,用户可以上传各种文档(如pdf、word)等。问题在于,外国用户上传的文件名是用阿拉伯语、中文、日语等写的,而系统虽然能够处理这些文件名并将它们添加到数据库中,但在尝试使用php下载这些文件时却出现了问题:

$result = mysql_query($query) or die('Error, query failed');

list($filename, $type, $filesize, $filepath) = mysql_fetch_array($result);

header("Content-Disposition: attachment; filename=$filename");

header("Content-length: $filesize");

header("Content-type: $type");

readfile($filepath);

系统无法识别文件名,因此无法下载文件。有什么建议吗?

你能打印一些有问题的文件名吗?另外,描述用于存储文件路径的列也会很好。直觉是它没有使用正确的编码插入。 - wai
3个回答

3

为了避免这个问题,我会为每个上传的文件生成一个唯一的ID,并使用该ID重命名文件,然后将ID、原始文件名和扩展名保存在数据库表中。然后,您可以轻松查找所需的ID,在表中检索原始文件名(您可能需要显示给人类阅读)和扩展名,然后下载{id}.{extension}文件。

这也有额外的好处,即如果上传了两个具有完全相同名称的文件,则后者上传不会覆盖原始文件。


1

在 PHP 5 和 Linux 上上传 Unicode 名称(例如:我是神.doc)可能会比较复杂,我怀疑有些操作系统不支持这样的文件名。

你可以尝试另一种解决方案,使用自定义名称(例如{file-id}.doc)上传文件,并将它们的信息(如原始文件名)存储在数据库表中。在下载页面上,您可以根据包含该文件信息的表中的信息修改标题。


1
如果您需要在MySQL中存储文件名,请确保您拥有适当的表和列排序规则,例如utf8_unicode_ci。连接后不要忘记执行mysql_query("SET NAMES utf8");。这应该足以正确地存储和检索Unicode字符串。
至于Content-Disposition头和非ASCII文件名,已经有一个很好的答案: "如何在HTTP中编码Content-Disposition头的文件名参数?"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接