我有一个表格,管理员会将三张不同尺寸的图片上传到三个不同的指定目录。现在要确保我没有遇到重复文件名的问题,我实现像php将比较上传的文件名,它将检查该文件名是否存在于指定目录中,如果是,那么它将回显错误并停止脚本执行。
现在我的一位朋友告诉我,要求管理员手动重命名图片文件并要求他们处理文件复制问题是非常糟糕的。他建议的解决方案是自动重命名文件,然后将其存储在数据库中,然后将其定向到目录。
我很困惑我应该为重命名的文件提供什么组合,并确保它将保持唯一的文件名,以便更精确,我希望您了解我的目录结构
正如我所说,管理员将上传三张图片文件
a)标题图片b)简要图片c) 细节图片
并将所有三个图片文件移动到不同的相应目录,如标题图片转到标题目录,依此类推。
我正在使用下面的脚本当前只是为了在数据库中使用varchar移动和存储文件名。
$ns_pic_title_loc= $_FILES["ns_pic_title"]["tmp_name"];
$ns_pic_title_name = $_FILES["ns_pic_title"]["name"];
move_uploaded_file($ns_pic_title_loc, $ns_title_target.$ns_pic_title_name) or die(mysql_error());
这只是示例代码,我没有包含我正在使用的验证功能。我想我想重命名所有文件,如
a)在标题目录中,文件应存储为。 title_1.jpg title_2.jpg title_3.jpg title_4.jpg
等等
和其他图片一样。我怎么做?我用什么功能来实现我的目标。如果这不是重命名文件的好方法,我将不胜感激任何重命名文件的建议。
提前致谢
答案 0 :(得分:2)
有各种各样的优点和缺点的好选择。
移动文件时使用php的tempnam,并将路径存储在mysql数据库中。 tempnam
生成一个唯一的文件名。
Use mysql to store the image content in a blob。这样,您将通过ID而不是路径名访问图像内容。
答案 1 :(得分:2)
为什么不使用PHP's tempnam() function,而不是让逻辑找出最新的图片名称并计算下一个数字增量?它会生成一个带有您选择前缀的唯一名称(即“标题”,“简要”,“详细信息”)。您还可以简单地在文件名前加一个时间戳 - 如果您没有同时上传图片的很多管理员,那么应该处理大多数名称冲突。
由于您的图片已经分类到title
,brief
和detail
目录,因此没有必要为每张图片命名title_*
,{{1}和brief_*
,对吗?如果它在标题目录中,那么它显然是标题图片。
此外,您将把文件名放在数据库中。然后在应用程序的其他地方,当您想要显示图片时,我假设您从数据库中获取了正确的文件名。因此,只要应用程序知道在哪里找到它,实际文件名就不重要了。如果这是正确的,则没有必要具有非常友好的名称,因此tempnam()文件名或时间戳加上原始文件名是可以接受的。
答案 2 :(得分:2)
嗯,这是一个可能的解决方案:
$_FILES["ns_pic_title"]["name"]
获取上传文件名并单独扩展名如果我们只是在讨论图片文件,请使用getimagesize($_FILES["ns_pic_title"]["tmp_name"])
获取图片类型; $file_name
变量'title_'.($max_id + 1)
move_uploaded_file($_FILES["ns_pic_title"]["tmp_name"], $ns_title_target.$file_name.'.'.$file_extension)
希望这是有道理和有帮助的。
答案 3 :(得分:0)
因为您正在将引用存储到数据库中,所以我更愿意只使用日期时间md5并将其用于文件名并将磁盘文件名也存储到数据库中。只要您可以使用DB中的唯一名称指向它,将它写入磁盘的名称无关紧要。
我使用这种方法,并且在我的测试中,磁盘名称(来自日期时间的md5)都不需要多次尝试。