Неверный URL из AWS S3 с загрузкой файла Laravel - PullRequest
0 голосов
/ 07 января 2019

Я загружаю изображение на S3 с помощью Laravel следующим образом:

$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 / профиль / 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 / профиль / 6_52644340.jpg

Я подтвердил, что файлы загружаются правильно и общедоступно.

Я попытался позвонить:

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

И это возвращает:

http://test -env.XXXX.us-west-2.elasticbeanstalk.com / профиль / https://elasticbeanstalk -us-west-2-XXX123XXX.s3.us-west-2.amazonaws.com / /profile/6_31595766.jpg

Обновление

Я только что заметил, что первая часть возвращаемого URL - это URL экземпляра BeanStalk с добавлением / profile /. Это даже странно, так как я не хочу использовать Beanstalk, я только хочу использовать S3.

Ответы [ 2 ]

0 голосов
/ 07 января 2019
$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('s3-url/s3-bucket'.'/'.$filepath);

 }
catch(\Exception $exx)
 {
   //Send to Logs Etc
 }
0 голосов
/ 07 января 2019

Если вы хотите сохранить весь URL, вы можете получить его из возвращаемой переменной, переданной из функции put().

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

Иногда мне нравится просто сохранять путь и сохранять только этот фрагмент в базе данных, тогда я могу передать путь к Storage::url($filePath);, и он все еще работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...