Laravel загрузить несколько файлов

Я создаю галерею с несколькими функциями файлов.

Пока у меня две проблемы, но давайте сначала вставим мой код.

Контроллер:

public function store(Request $request)
{

  $gallery = new GalleryImage();

  if ($request->hasFile('image')) {
    $images = $request->file('image');
    foreach($images as $image) {
      $path = $image->getClientOriginalName();
      $name = time() . '-' . $path;
      $gallery->image = $image->move(public_path().'/uploads/temp/', $name);
      //$gallery->image = $request->file('image')->storeAs('public/gallery-images', $name);
    }
  }

  $gallery->gallery_id = $request->gallery_id;

  $gallery->save();

  return back()->with('success_message','Images has been uploaded!');
}

Посмотреть лезвие:

    <form action = "{{ route('gallery-images.store') }}" method = "POST" enctype = "multipart/form-data">
      {{ csrf_field() }}
      <div class = "form-group">
        <input type = "hidden" name = "gallery_id" value = "{{ $gallery->id }}">
        <input type = "file" name = "image[]" id = "id_imageGallery" class = "form-control" multiple = "multiple" required>
      </div>
      <div class = "form-group">
        <button type = "submit" class = "btn btn-primary">Upload</button>
      </div>
    </form>

Моя первая проблема, когда у меня такой код и я загружаю три файла, он успешно сохраняет файлы в каталоге /uploads/temp, но в моей базе данных я вижу, что загружено только одно изображение вместо трех.

Моя вторая проблема заключается в том, что я изменяю свой код и использую закомментированную часть (потому что я хочу сохранить эти три изображения в хранилище):

$gallery->image = $request->file('image')->storeAs('public/gallery-images', $name);

Я получаю эту ошибку:

Call to a member function storeAs() on array

Как я могу загрузить эти несколько изображений в папку «Хранилище» и записать их все в базу данных?

-- РЕДАКТИРОВАТЬ -- Я решил свою первую проблему!

Я просто поместил в цикл метод сохранения и другие детали. Я должен был подумать об этом раньше :)

Вот мой обновленный код:

public function store(Request $request)
{


  if ($request->hasFile('image')) {

    $images = $request->file('image');
    foreach($images as $image) {
      $gallery = new GalleryImage();
      $path = $image->getClientOriginalName();
      $name = time() . '-' . $path;
      $gallery->image = $image->move(public_path().'/uploads/temp/', $name);
      //$gallery->image = $request->file('image')->storeAs('public/gallery-images', $name);

      $gallery->gallery_id = $request->gallery_id;
      $gallery->save();
    }
  }


  return back()->with('success_message','Images has been uploaded!');
}

Теперь осталось только сохранить их в хранилище файлов вместо public_path и избежать этой ошибки:

Call to a member function storeAs() on array 
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
3 612
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте реализовать, используя следующий код, он предоставит URL-адрес загруженных файлов в сериализованном формате.

    public static function upload_file($file){
        $file_name = time();
        $file_name .= rand();
        $file_name = sha1($file_name);
        if ($file) {
            $ext = $file->getClientOriginalExtension();
            $file->move(public_path() . "/uploads", $file_name . "." . $ext);
            $local_url = $file_name . "." . $ext;
            $s3_url = url('/').'/uploads/'.$local_url;
            return $s3_url;
        }
        return "";
    }

    public static function upload_multiple_files($files){
        if (is_array($files)){
            $return_array = array();
            foreach ($files as $file){
                if (!empty($file)){
                    $return_array[] = self::upload_file($file);
                }else{
                    $return_array[] = '';
                }
            }
            return serialize($return_array);
        }else{
            return NULL;
        }
    }

Слишком сложно и не имеет отношения к делу.

user2519032 13.05.2019 10:53

Я сам понял, как хранить несколько файлов в базе данных. Единственное, что нужно сделать, это как сохранить их в хранилище файлов, а не в public_path. Проверьте мою обновленную основную тему.

user2519032 13.05.2019 11:09
Ответ принят как подходящий

Я, наконец, решил проблемы, и я публикую это, так что это может быть полезно для некоторых.

Вот мой код:

public function store(Request $request)
{

  if ($request->hasFile('image')) {

    foreach($request->image as $image) {
      $path = $image->getClientOriginalName();
      $name = time() . '-' . $path;

      $gallery = new GalleryImage();
      $gallery->image = $image->storeAs('public/gallery-images', $name);
      $gallery->gallery_id = $request->gallery_id;
      $gallery->save();
    }
  }

  return back()->with('success_message','The images have been uploaded!');
}

// Я обновил и прокомментировал ваш код. Попробуйте, должно получиться.

public function store(Request $request)
    {
      if ($request->hasFile('image')) {

        $images = $request->file('image');
        foreach($images as $image) {
          $gallery = new GalleryImage();
          // laravel auto manages unique name and extension of file.
          $gallery->image = $image->store('gallery-images', 'public'); 
          $gallery->gallery_id = $request->gallery_id;
          $gallery->save();
        }
      }
      return back()->with('success_message','Images has been uploaded!');
    }

Пожалуйста, проверьте мой ответ. Я решил проблему. Кстати, я только что проверил ваше решение, и в нем есть ошибки. магазин('галерея-изображения', 'общедоступный'); вы не передаете здесь переменную, а также очень важно загрузить изображение в удобном для пользователя файле, а не закодированном

user2519032 13.05.2019 13:18

В моем коде нет ошибки. Все, что вам нужно передать, это имя папки и область действия для сохранения функции. laravel.com/docs/5.8/filesystem#file-visibility вы можете обратиться по этой ссылке. И поздравления для самостоятельного решения. Удачного кодирования!!

Bishal Jung Chettri 13.05.2019 13:29

Спасибо, что разъяснили это. Вам тоже удачного кодирования! :)

user2519032 13.05.2019 14:29

Другие вопросы по теме