Я создаю галерею с несколькими функциями файлов.
Пока у меня две проблемы, но давайте сначала вставим мой код.
Контроллер:
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






Попробуйте реализовать, используя следующий код, он предоставит 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;
}
}
Я сам понял, как хранить несколько файлов в базе данных. Единственное, что нужно сделать, это как сохранить их в хранилище файлов, а не в public_path. Проверьте мою обновленную основную тему.
Я, наконец, решил проблемы, и я публикую это, так что это может быть полезно для некоторых.
Вот мой код:
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!');
}
Пожалуйста, проверьте мой ответ. Я решил проблему. Кстати, я только что проверил ваше решение, и в нем есть ошибки. магазин('галерея-изображения', 'общедоступный'); вы не передаете здесь переменную, а также очень важно загрузить изображение в удобном для пользователя файле, а не закодированном
В моем коде нет ошибки. Все, что вам нужно передать, это имя папки и область действия для сохранения функции. laravel.com/docs/5.8/filesystem#file-visibility вы можете обратиться по этой ссылке. И поздравления для самостоятельного решения. Удачного кодирования!!
Спасибо, что разъяснили это. Вам тоже удачного кодирования! :)
Слишком сложно и не имеет отношения к делу.