PHP:存储文件位置...如果被覆盖怎么办?

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

我目前正在使用 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/

相关文章:

javascript - 使用按钮传递变量(Ajax Modal)

php - 使用 php 脚本和连接检查外部服务器数据库的可用性

php - 使用 Web 浏览器在本地打开编辑器并使用 php 检索服务器上的数据?

php - 如何在移动图像时动态创建文件夹?

php - 通过 PHP 上传 ZIP 文件和 UNZIP ftp 文件夹

php - 为什么调用 __call 而不是 __callStatic

php - 内部连接返回重复项

php - 如何创建一个 Doctrine 实体的模拟对象?

php - 如何在 Zend 中优化我的查询?

file-upload - Docker Rocket chat Rest api上传文件报错413 Entity too large