带有Laravel文件上传的AWS S3的URL错误

时间:2019-01-07 17:04:40

标签: laravel amazon-s3

我正在使用Laravel将图像上传到S3,如下所示:

$image = $request->image;

if (!empty($image)) {
   $imageFileName = $user_id.'_'.rand(11111111, 99999999) . '.' . $image->getClientOriginalExtension(); // Rename Image

try
{
   //Send to S3
   $s3 = Storage::disk('s3');
   $filePath = '/profile/' . $imageFileName;
   $s3->put($filePath, file_get_contents($image), 'public');  
   $image = Storage::cloud()->url($imageFileName);

 }
catch(\Exception $exx)
 {
   //Send to Logs Etc
 }

图像成功上传,但是我需要将URL存储在数据库中。在这里被称为:

$image = Storage::cloud()->url($imageFileName);

问题是返回的URL,看起来像这样:

http://test-env.XXX.us-west-2.elasticbeanstalk.com/profile/https://elasticbeanstalk-us-west-2-123XXX456XXX.s3.us-west-2.amazonaws.com/6_52644340.jpg

因此:

http://mentr-test-env.2w8sh3esch.us-west-2.elasticbeanstalk.com/profile/

有点正确。但是下一部分缺少'profile'子文件夹,并且显然再次从HTTPS开始:

https://elasticbeanstalk-us-west-2-123XXX456XXX.s3.us-west-2.amazonaws.com/6_52644340.jpg

似乎我在单个字符串中得到了一半的链接。我不会在其他任何地方编辑$ image变量。

正确的链接是:

https://elasticbeanstalk-us-west-2-123XXX456XXX.s3.us-west-2.amazonaws.com/profile/6_52644340.jpg

我已经确认文件可以正确上传并且可以公开访问。

我尝试致电:

$image = Storage::cloud()->url($filePath);

这将返回:

http://test-env.XXXX.us-west-2.elasticbeanstalk.com/profile/https://elasticbeanstalk-us-west-2-XXX123XXX.s3.us-west-2.amazonaws.com//profile/6_31595766.jpg

更新

我刚刚注意到返回的URL的第一部分是添加了/ profile /的BeanStalk实例URL。因为我不想使用Beanstalk,我只想使用S3,所以这甚至很陌生。

2 个答案:

答案 0 :(得分:0)

如果要存储整个URL,可以从put()函数传回的返回变量中获取。

$s3_url = $s3->put($filePath, file_get_contents($image), 'public');

有时候我喜欢只存储路径,然后将其保存到数据库中,然后将路径传递到Storage::url($filePath);,它仍然可以工作。

答案 1 :(得分:0)

except HttpError as e:
    printf('Failed to create %s: %s\n', instanceName,   
            e._get_reason())
    raise HTTPError(
            None, int(e.resp['status']), e._get_reason(), "", None)