Файл не существует в S3 с использованием Laravel, хотя он есть

Я создаю веб-сайт и загружаю некоторые файлы изображений в 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: в настоящее время он работает, он начал работать сам по себе ...

Вы проверили, что в вашем экземпляре s3 есть папка под названием скриншоты. Вы проверили, действительно ли ваш laravel подключил одно и то же ведро?

Marcus 23.07.2018 12:10

@Marcus да, в ведре есть скриншоты папки, и Laravel успешно подключается, потому что я загружаю изображение из того же проекта.

Petar Vasilev 23.07.2018 14:17

Что дает вам ´Storage :: disk ('s3') -> getVisibility ('screenshots / 15322834305‌ 1117.png'); ´? Предоставляет ли ARN разрешение на удаление файлов в вашей корзине? Как вы загрузили файл?

Dimitri Mostrey 23.07.2018 17:53

@DimitriMostrey сейчас работает, начал работать сам по себе ...

Petar Vasilev 23.07.2018 18:08

Приятно слышать. Начало работы с S3 было для меня крутой кривой обучения. У меня ушла неделя, чтобы все исправить. Теперь обслуживает миллион файлов без сбоев. Это была настройка IAM / ARN? Что бы ни. Оно работает.

Dimitri Mostrey 23.07.2018 18:12

@DimitriMostrey Я не знаю, в чем была проблема. Я не менял код, он просто начал работать, потому что код правильный, я думаю, это могла быть проблема S3.

Petar Vasilev 23.07.2018 18:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
6
1 142
1

Ответы 1

Если цикл выполняется более одного раза, он вызовет эту ошибку в вашем тесте, потому что файл жестко закодирован.

$ notDeletedYet, вероятно, возвращает более одного объекта, поэтому, когда вы запускаете этот метод с жестко закодированной строкой, первая итерация удалит файл по назначению, а вторая итерация не найдет файл, который приведет к вашему исключению

В настоящее время есть только один файл, и я проверяю в базе данных, а затем в S3, был ли он отмечен как удаленный, а файл удален из S3 соответственно, и ни то, ни другое не сделано.

Petar Vasilev 23.07.2018 15:20

Итак, если вы dd ($ notDeletedYet), он вернет только один?

Marcus 23.07.2018 15:21

Да, это всего лишь один - также, я просто попробовал еще раз, и он начал работать ... надеюсь, он продолжит работать.

Petar Vasilev 23.07.2018 15:24

У меня могла быть проблема с S3

Petar Vasilev 23.07.2018 15:47

Хорошо, надеюсь, ты выяснишь, что было причиной этого

Marcus 24.07.2018 08:09

Другие вопросы по теме