我目前正在使用Zend Framework并有一个上传文件表单。经过身份验证的用户可以上载文件,该文件将存储在应用程序的目录中,以及存储在数据库中的位置。这样它就可以显示为可以下载的文件。
<a href="/upload-location/filename.pdf">Download</a>
但我注意到的是,具有相同名称的文件将覆盖uploads目录中的文件。没有错误消息,文件名也没有增加。所以我认为文件必须被覆盖(或从不上传)。
上传,移动或存储这些文件时,我应该注意哪些最佳做法?我是否应该始终重命名文件,以便文件名始终是唯一的?
答案 0 :(得分:9)
通常,我们不会存储具有用户名称的文件,而是使用我们(即我们的应用程序) chosse的名称。
例如,如果用户上传my_file.pdf
,我们会:
id
;自动增量,主键 - “123
”,例如application/pdf
或类似的东西。file-123
id=123
的文件发出请求时,我们知道应该提取哪个物理文件('file-' . $id
)并发送。这样,我们确保:
答案 1 :(得分:1)
继续Pascal MARTIN的回答:
如果使用id作为名称,您还可以提出目录命名策略。我不再从文件系统获取/somedir/part1ofID/part2OfID
而不是/somedir/theWholeID
,但它可以让您从分割ID以形成路径和文件名的方式中选择存储在同一目录中的文件数。 / p>
下一个好处是,用于将文件实际输出给用户的脚本可以选择是否授权用户查看文件。这当然要求文件存储在默认情况下不是每个人都可读的地方。
您可能还想查看this other question。并不完全相关,但要注意很好。
答案 2 :(得分:0)
是的,您需要想出一种方法来唯一地命名它们。我已经看到了各种不同的策略,从orignal文件名的哈希基础,db记录的pk和上传时间戳到某种类型的段塞,再次基于db记录中的varous字段附加到或相关记录。