Загрузка нескольких изображений на s3 с использованием laravel при неисправности heroku - PullRequest
1 голос
/ 12 января 2020

Я пытаюсь l oop над несколькими входными файлами выбрать элемент

<label class="btn btn-success btn-md rounded-1" for="galleryFile">Create Album</label>
<input type="file" name="galleryFile[]" id="galleryFile" class="d-none" multiple accept="image/*">

и сохранить все выбранные изображения в AWS s3

public function sendToCloud($file, $folder, $prefix) {
  $filePath = Auth::user()->userid . '/' .$folder.'/' . $prefix;

  $extension = $file->getClientOriginalExtension();
  $filename  = $filePath . time() . '.' . $extension;

  Storage::disk('s3')->put($filename, fopen($file, 'r+'), 'public');
  return Storage::disk('s3')->url($filename);
}

$unikPath = uniqid();
foreach ($request->file('galleryFile') as $key => $file) {
  if ($key == array_key_last($request->file('galleryFile'))) {
    $galleryUrl .= $this->sendToCloud($file, $unikPath . '/gallery', 'img_');
  } else {
    $galleryUrl .= $this->sendToCloud($file, $unikPath . '/gallery', 'img_') . ' | ';
  }
}

на моей локальной машине это работает очень хорошо, заставляя меня поверить, что это не проблема с моим кодом или laravel, но когда я развернул на heroku, поведение загрузки изменилось. Что делает на heroku:

, если я выбрал 10 изображений для загрузки, он случайным образом выбирает и сохраняет 2 из этих изображений на s3 и возвращает URL-адрес s3 этих 2 изображений 10 раз.

Я ценю любую помощь, указывающую в правильном направлении, как решить эту проблему.

Заранее спасибо.

1 Ответ

1 голос
/ 19 января 2020

Когда я опубликовал этот ответ, вы написали ответ, объясняющий ваше решение. Однако лучшим решением будет -

  1. генерировать случайные имена файлов, используя random_bytes (вместе с bin2hex), а не uniqid, и
  2. проверьте, открыли ли вы существующий файл с fopen($file, ...), и, если это так, создайте другое имя файла, чтобы избежать перезаписи существующего.

Кроме того, решение, которое вы даете в своем ответе, это fr agile - это предполагается, что системное время никогда не изменится во время работы вашего приложения, что может не всегда иметь место по многим причинам, включая синхронизацию часов сервера. См. Также документацию для uniqid.

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