我正在建立一个网站,并将一些图像文件上传到S3,然后尝试删除相同的文件,但是由于某些原因,Laravel找不到该文件,即使我三遍检查了该文件是否为在S3中。
这是我正在使用的代码:
<?php
namespace App\Logic;
use App\UrlRequest;
use Exception;
use Illuminate\Support\Facades\Storage;
class OldRequests {
/**
* Gets all requests older than 1 day and deletes the corresponding image
* in s3 if it has not been already deleted
*/
static function ifOlderThan1DaysDeleteImage()
{
$now = time();
$time1DaysAgo = $now - (1*24*60*60);
$datetime1DaysAgo = date('Y-m-d H:i:s', $time1DaysAgo);
$notDeletedYet = UrlRequest::where('image_deleted', '=', 0)
->where('created_at', '<', $datetime1DaysAgo)
->get();
foreach ($notDeletedYet as $request)
{
if ( ! Storage::disk('s3')->exists('screenshots/153228343051117.png'))
{
throw new Exception('Image file not found in S3.');
}
$result = Storage::disk('s3')->delete('screenshots/153228343051117.png');
if ($result);
{
$request->image_deleted = 1;
$request->save();
}
}
}
}
上面的代码引发异常:在S3中找不到图像文件。
请注意,文件名是硬编码的,尽管通常它来自作为UrlRequest模型实例的$ request变量。
我不知道如何进行此操作,因此非常感谢您的帮助!
编辑:我再次尝试了上面的代码,并且只工作了一次;但是我上传了一张新图片,现在它不再起作用了。
EDIT2:目前可以使用,它可以自己开始工作...
答案 0 :(得分:0)
如果循环运行不止一次,由于文件是硬编码的,它将在测试中引发该错误。
$ notDeletedYet可能返回一个对象,因此,当您使用硬编码字符串运行该方法时,第一次迭代将按预期方式删除文件,而第二次迭代将找不到将导致异常的文件