即使使用Laravel,文件在S3中也不存在

时间:2018-07-23 09:00:04

标签: laravel laravel-5 amazon-s3 upload

我正在建立一个网站,并将一些图像文件上传到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:目前可以使用,它可以自己开始工作...

1 个答案:

答案 0 :(得分:0)

如果循环运行不止一次,由于文件是硬编码的,它将在测试中引发该错误。

$ notDeletedYet可能返回一个对象,因此,当您使用硬编码字符串运行该方法时,第一次迭代将按预期方式删除文件,而第二次迭代将找不到将导致异常的文件