PHP:存储文件位置......如果覆盖了什么?

时间:2009-12-10 19:28:23

标签: php zend-framework file-upload zend-file

我目前正在使用Zend Framework并有一个上传文件表单。经过身份验证的用户可以上载文件,该文件将存储在应用程序的目录中,以及存储在数据库中的位置。这样它就可以显示为可以下载的文件。

<a href="/upload-location/filename.pdf">Download</a>

但我注意到的是,具有相同名称的文件将覆盖uploads目录中的文件。没有错误消息,文件名也没有增加。所以我认为文件必须被覆盖(或从不上传)。

上传,移动或存储这些文件时,我应该注意哪些最佳做法?我是否应该始终重命名文件,以便文件名始终是唯一的?

3 个答案:

答案 0 :(得分:9)

通常,我们不会存储具有用户名称的文件,而是使用我们(即我们的应用程序) chosse的名称。

例如,如果用户上传my_file.pdf,我们会:

  • 在数据库中存储一行,包含:
    • id;自动增量,主键 - “123”,例如
    • 用户提供的名称;所以我们可以在有人试图下载文件时发送正确的名称
    • 文件的内容类型;例如,application/pdf或类似的东西。
    • “我们的”名称:例如file-123
  • 当对id=123的文件发出请求时,我们知道应该提取哪个物理文件('file-' . $id)并发送。
  • 我们可以设置一些标题,以便使用我们存储在数据库中的名称将“逻辑”名称更正为浏览器,用于“另存为”对话框
  • 内容类型相同,btw

这样,我们确保:

  • 没有文件有任何“错误”的名称,因为我们是选择它的人,而不是客户
  • 没有覆盖:因为我们的文件名包含我们表的主键,所以这些文件名是唯一的

答案 1 :(得分:1)

继续Pascal MARTIN的回答:

如果使用id作为名称,您还可以提出目录命名策略。我不再从文件系统获取/somedir/part1ofID/part2OfID而不是/somedir/theWholeID,但它可以让您从分割ID以形成路径和文件名的方式中选择存储在同一目录中的文件数。 / p>

下一个好处是,用于将文件实际输出给用户的脚本可以选择是否授权用户查看文件。这当然要求文件存储在默认情况下不是每个人都可读的地方。

您可能还想查看this other question。并不完全相关,但要注意很好。

答案 2 :(得分:0)

是的,您需要想出一种方法来唯一地命名它们。我已经看到了各种不同的策略,从orignal文件名的哈希基础,db记录的pk和上传时间戳到某种类型的段塞,再次基于db记录中的varous字段附加到或相关记录。