我正在使用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://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);
这将返回:
更新
我刚刚注意到返回的URL的第一部分是添加了/ profile /的BeanStalk实例URL。因为我不想使用Beanstalk,我只想使用S3,所以这甚至很陌生。
答案 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)