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

时间:2009-07-08 07:10:00

标签: php sql unicode filenames

我有一个系统,用户上传文件(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);

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

3 个答案:

答案 0 :(得分:3)

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

这还有一个额外的好处,即如果上传两个文件使用完全相同的名称,后一个文件将不会覆盖原始文件。

答案 1 :(得分:1)

将上传的Unicode名称(例如我是神.doc)上传至php 5和linux很复杂,我怀疑各种操作系统不支持此类文件名

一种替代方法是上传一些自定义名称可能是{file-id} .doc并将其信息(如原始文件名)存储在数据库表中。在下载页面上,您可以使用存储的信息修改标题包含该文件信息的表

答案 2 :(得分:1)

如果您需要在MySQL中存储文件名,请确保您具有正确的表和列排序规则,例如utf8_unicode_ci。连接后别忘了mysql_query("SET NAMES utf8");。这应该足以正确存储和检索Unicode字符串。

至于Content-Disposition标题和非ASCII文件名,对此已有一个很好的答案:“How to encode the filename parameter of Content-Disposition header in HTTP?