phplaravelamazon-s3

Path of the file stored in s3 does not match with provided - Using Laravel


I'm building a service to upload images with laravel and stored in a aws s3 bucket, this is the function responsible for store image.

public function fromUrl(Request $request)
{
  $validator = Validator::make($request->all(), [
    'files'   => 'required|array|min:1',
    'files.*' => 'string',
  ]);

  if (!$validator->fails()) {
    $paths = [];
    foreach ($validator->validate()['files'] as $file) {
      $url = config('services.s3.host') . Storage::disk('s3')->put('images/public', file_get_contents($file), 'public');
      array_push($paths, $url);
    }
    return $paths;
  } else {
    throw new ValidateException([
      'message' => $validator->errors()->toArray(),
      'rules' => $validator->failed()
    ]);
  }
}

The request body looks like this.

{
  "files": [
    "https://image-url-1",
    "https://image-url-2"
  ]
}

I expect that the path returned when saving the image is something like this.

[
  "https://my-bucket-url/images/public/random-name-for-image1",
  "https://my-bucket-url/images/public/random-name-for-image2"
]

but instead I'm getting the following.

[
  "https://my-bucket-url/1",
  "https://my-bucket-url/1"
]

Solution

  • You are misusing put in your example.

    Firstly the first parameter is the path plus filename and you have no filename random logic. The third parameter is options array.

    $randomFileName = uniqid(rand(), true);
    
    $path = 'images/public/' . $randomFileName;
    
    Storage::disk('s3')->put($path, file_get_contents($file));
    

    This code will save an element at images/public/$randomFileName. To return the proper path you can use the url() method.

    $url = Storage::disk('s3')->url($path);
    
     array_push($paths, $url);