Я создаю веб-сайт и загружаю некоторые файлы изображений в 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.
Обратите внимание, что имя файла жестко запрограммировано, хотя обычно оно исходит из переменной $ request, которая является экземпляром модели UrlRequest.
Я понятия не имею, как поступить с этим, поэтому приветствую любую помощь!
Обновлено: Я снова попробовал приведенный выше код, и он сработал один раз; однако я загрузил новое изображение, и теперь оно снова не работает.
EDIT2: в настоящее время он работает, он начал работать сам по себе ...
@Marcus да, в ведре есть скриншоты папки, и Laravel успешно подключается, потому что я загружаю изображение из того же проекта.
Что дает вам ´Storage :: disk ('s3') -> getVisibility ('screenshots / 15322834305 1117.png'); ´? Предоставляет ли ARN разрешение на удаление файлов в вашей корзине? Как вы загрузили файл?
@DimitriMostrey сейчас работает, начал работать сам по себе ...
Приятно слышать. Начало работы с S3 было для меня крутой кривой обучения. У меня ушла неделя, чтобы все исправить. Теперь обслуживает миллион файлов без сбоев. Это была настройка IAM / ARN? Что бы ни. Оно работает.
@DimitriMostrey Я не знаю, в чем была проблема. Я не менял код, он просто начал работать, потому что код правильный, я думаю, это могла быть проблема S3.






Если цикл выполняется более одного раза, он вызовет эту ошибку в вашем тесте, потому что файл жестко закодирован.
$ notDeletedYet, вероятно, возвращает более одного объекта, поэтому, когда вы запускаете этот метод с жестко закодированной строкой, первая итерация удалит файл по назначению, а вторая итерация не найдет файл, который приведет к вашему исключению
В настоящее время есть только один файл, и я проверяю в базе данных, а затем в S3, был ли он отмечен как удаленный, а файл удален из S3 соответственно, и ни то, ни другое не сделано.
Итак, если вы dd ($ notDeletedYet), он вернет только один?
Да, это всего лишь один - также, я просто попробовал еще раз, и он начал работать ... надеюсь, он продолжит работать.
У меня могла быть проблема с S3
Хорошо, надеюсь, ты выяснишь, что было причиной этого
Вы проверили, что в вашем экземпляре s3 есть папка под названием скриншоты. Вы проверили, действительно ли ваш laravel подключил одно и то же ведро?