适用于Amazon S3的Laravel存储的“放置”方法使用了错误的URL

时间:2019-05-21 22:33:37

标签: laravel amazon-s3 storage

我正在使用Laravel 5.7开发一个应用程序,当前正在尝试使用Amazon S3实现图像存储。我将league/flysystem-aws-s3-v3包与Laravel内置的Storage Facade结合使用。当我尝试上传图片时,Storage->put()命令生成了错误的URL。

我在线上关注了多个教程和文档,所有这些都仅使用以下命令

Storage::disk('s3')->put('{file_name}', '{file_content}')

,并且file_name自动以amazon s3 url为前缀;但是,对我而言并非如此。但是,如果我在AWS_URL中进行硬编码,则一切正常。我在.env文件中设置了所有正确的值(我相信),但是Laravel似乎无法正确获取AWS_URL

我已经尝试过使用env值前后是否加引号。我也跑了

php artisan config:cache
php artisan cache:clear

清除环境变量的缓存。

.env

AWS_ACCESS_KEY_ID="**************"
AWS_SECRET_ACCESS_KEY="****************"
AWS_DEFAULT_REGION="us-east-1"
AWS_BUCKET="*****"
AWS_URL=http://******.s3.us-east-1.amazonaws.com

filesystems.php

's3' => [
        'driver' => 's3',
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'region' => env('AWS_DEFAULT_REGION'),
        'bucket' => env('AWS_BUCKET'),
        'url' => env('AWS_URL'),
    ],

使用php artisan tinker

这样可以正确上传文件,但是我不需要对URL进行硬编码。

>>> Storage::disk('s3')->put('snoflow.s3.us-east-1.amazonaws.com/Hello.txt', 'Hello World!');
=> true`

这是应该如何调用命令但给出错误的方式。请注意,尝试的网址仅是文件名。

>>> Storage::disk('s3')->put('Hello.txt', 'Hello World!');
=> Aws/S3/Exception/S3Exception with message 'Error executing "PutObject" on "https://filename.txt"; AWS HTTP error: cURL error 6: Could not resolve host: filename.txt (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)'`

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我通过删除.env中的AWS_URL键来解决此问题。

答案 1 :(得分:0)

我遇到了同样的错误,看起来 AWS HTTP 构建不正确。并通过修改.env

解决

之前:

AWS_ACCESS_KEY_ID=*****
AWS_SECRET_ACCESS_KEY=*****
AWS_DEFAULT_REGION=*****
AWS_BUCKET=*****
AWS_URL=
AWS_ENDPOINT=
AWS_USE_PATH_STYLE_ENDPOINT=false

之后:

AWS_ACCESS_KEY_ID=*****
AWS_SECRET_ACCESS_KEY=*****
AWS_DEFAULT_REGION=*****
AWS_BUCKET=*****