我目前正在使用 Zend Framework 并有一个上传文件表单。经过身份验证的用户可以上传文件,该文件将存储在应用程序的目录中,位置存储在数据库中。这样它就可以显示为可以下载的文件。
<a href="/upload-location/filename.pdf">Download</a>
但我注意到的是同名文件将覆盖上传目录中的文件。没有错误消息,文件名也没有增加。所以我认为该文件必须被覆盖(或永远不会上传)。
上传、移动或存储这些文件时,我应该注意哪些最佳做法?我是否应该始终重命名文件以使文件名始终唯一?
最佳答案
通常,我们不会使用用户给定的名称存储文件,而是使用我们(即我们的应用程序)选择的名称。
例如,如果用户上传 my_file.pdf
,我们将:
- 在数据库中存储一行,包含:
id
;一个自动增量,主键——例如“123
”- 用户给的名字;这样我们就可以在有人尝试下载文件时发送正确的名称
- 文件的内容类型;
application/pdf
或类似的东西,例如。 - “我们的”名称:例如
file-123
- 当有对
id=123
文件的请求时,我们知道应该获取和发送哪个物理文件 ('file-' . $id
)。 - 并且我们可以设置一些标题以将正确的“逻辑”名称发送到浏览器,使用我们存储在数据库中的名称,用于“另存为”对话框
- 内容类型相同,顺便说一句
这样,我们确保:
- 没有文件有任何“错误”的名称,因为我们是选择它的人,而不是客户
- 没有覆盖:因为我们的文件名包含我们表的主键,所以这些文件名是唯一的
关于PHP:存储文件位置...如果被覆盖怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1883371/