我有一个系统,用户上传文件(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);
系统无法识别文件名,因此不会下载文件。有什么建议吗?
答案 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?”