我正在开发CakePHP 2.4.4上的一个项目。我面临以下问题:我的供应商上传类调用一个函数newImage
来创建一个新图像。当我上传多个图像例如五次时,连续五次调用此函数。此函数包含如下代码:
...
...initializing Uploader class
...
//creating image
$this->Orderimage->create();
$data = array(
'order_id' => $order_id,
'filename' => $filename,
'date' => date('Y-m-d'),
'extension' => $result['ext'],
);
$this->Orderimage->save($data);
但这里是我遇到问题的地方。当我尝试上传超过4张图片时,这意味着我连续4次调用此功能时,某些图片不会上传,而是上传以前的图片。原因是这些图像的文件名相同。但文件名由最后创建的图像+ 1给出。因此,错误是数据库没有足够的时间来保存图像,当下一次到达时。这就是为什么一些图像会覆盖另一个图像的原因。我怎么能解决它?
答案 0 :(得分:1)
尝试将文件名设置为唯一的,而不是仅使用+1
。
例如:
$filename = CakeText::uuid() . '.jpg'; // or try String::uuid()
这样你就不必担心意外地拥有相同的文件名。
https://book.cakephp.org/2.0/en/core-utility-libraries/string.html#CakeText::uuid
附注:如果您将大量文件上传到单个目录中,最好将它们放在嵌套目录中(通常为3深)。例如:
$filename = rand(0,99) . DS . rand(0,99) . DS . rand(0,99) . $file;
如果你这样做,你很可能在同一个文件夹中拥有相同的文件名+数字组合。只需存储路径和文件名,就可以了。这将使单个文件夹不具有如此多的图像,以便永远查看它。
注意:我刚刚编写了这个代码 - 我没有验证它的语法等等,但它应该给你这个想法。
答案 1 :(得分:0)
Daves解决方案应解决您的问题,但如果您坚持使用您的文件名约定,请获取最后插入的ID并在$lastInsertedId + $counter
bevore保存它们的循环中创建所有图像。然后将孔图像数组写入数据库。
注意:只有在没有同时写入请求时才应使用此解决方案!