【问题标题】:File does not exist in S3 using Laravel even though it is there使用 Laravel 的 S3 中不存在文件,即使它存在
【发布时间】:2018-12-30 16:25:37
【问题描述】:

我正在建立一个网站,我正在将一些图像文件上传到 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();
            }
        }
    }
}

以上代码抛出异常:Image file not found in S3.

请注意,文件名是硬编码的,尽管它通常来自作为 UrlRequest 模型实例的 $request 变量。

我不知道如何进行此操作,因此非常感谢任何帮助!

编辑:我再次尝试了上面的代码并且它工作了一次;但是我上传了一张新图片,现在它又不能正常工作了。

EDIT2:它目前工作,它开始自己工作......

【问题讨论】:

  • 您是否检查过您的 s3 实例有一个名为 screenshots 的文件夹。你检查你的 laravel 是否真的连接了同一个桶?
  • @Marcus 是的,bucket 有一个文件夹 screenshots 并且 Laravel 连接成功,因为我从同一个项目上传了图像。
  • 'Storage::disk('s3')->getVisibility('screenshots/153228343051117.png');' 给你什么? ARN 是否授予您删除存储桶上文件的权限?您是如何上传文件的?
  • @DimitriMostrey 它目前可以工作,它开始自行工作......
  • @DimitriMostrey 我不知道是什么问题我没有更改它刚刚开始工作的代码,因为它应该因为代码是正确的,我想这可能是一个 S3 问题。

标签: laravel laravel-5 amazon-s3 upload


【解决方案1】:

如果循环多次运行,它将在您的测试中抛出该错误,因为该文件是硬编码的。

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

【讨论】:

  • 目前只有一个文件,我在数据库中检查,然后在 S3 中检查它是否被标记为已删除,文件分别从 S3 中删除,两者都没有完成。
  • 所以如果你 dd($notDeletedYet) 它只返回一个?
  • 是的,它只是一个 - 而且,我刚刚再次尝试它并开始工作......希望它会继续工作。
  • 我可能是 S3 的问题
  • 好吧,希望你弄清楚是什么原因造成的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多