Обработка загрузки нескольких изображений с помощью React JS и Laravel

Я хочу загрузить несколько изображений в базу данных, используя axios в reactjs, чтобы отправлять данные с клиентской стороны на серверную и обрабатывать загрузку изображения с помощью laravel на стороне сервера. Моя проблема в том, что всякий раз, когда я пытаюсь обработать несколько изображений на стороне сервера, это не работает.

Это мой код.

КЛИЕНТСКАЯ СТОРОНА (ReactJS)

КОНСТРУКТОР:

constructor(props){
        super(props);
        this.state = {
            id: "upload-photo",
            imageArray: [],
            body: '',
            posts: [],
            // image: []
        };
        this.handleSubmit = this.handleSubmit.bind(this);
        this.handleBodyChange = this.handleBodyChange.bind(this);
    }

ХанлеФайлеОбновлено:

handleFileChange(e){
        if (e.target.files) {
            const files = Array.from(e.target.files);

            const promises = files.map(file => {
                return (new Promise((resolve, reject) => {
                    const reader = new FileReader();
                    reader.addEventListener('load', (ev) => {
                        resolve(ev.target.result);
                    });
                    reader.addEventListener('error', reject);
                    reader.readAsDataURL(file);
                }))
            });

            Promise.all(promises).then(images => {
                this.setState({
                    imageArray: images
                })
            }, error => { console.error(error); });
        }
        if (this.props.onChange !== undefined) {
            this.props.onChange(e);
        }
    }

Обработать отправку изменений:

handleSubmit(e) {
        e.preventDefault();
        // this.postData();
        const formData = new FormData();
        this.state.imageArray.forEach((image_file) => {
             formData.append('file[]', image_file);
        });
        formData.append('body', this.state.body);
        for (let pair of formData.entries()) {
            console.info(pair[0]+ ', ' + pair[1]);
        }
        axios.post('/posts', formData)
            .then(response => {
            this.setState({
                posts: [response.data]
            })
        });
        this.setState({
            body: ''
        });
    }

СЕРВЕРНАЯ СТОРОНА (LARAVEL)

public function create(Request $request, Post $post) {
        $data = [];
        if ($request->get('file')) {
            foreach ($request->get('file') as $file) {
                $name = time() . '.' . explode('/', explode(':', substr($file, 0, strpos($file, ';')))[1])[1];
                \Image::make($file)->save(public_path('images/') . $name);
                array_push($data, $name);
            }
        }
        $image = json_encode($data);
        // create post
        $createdPost = $request->user()->posts()->create([
            'body' => $request->body,
            'image' => $image
        ]);
        // return the response
        return response()->json($post->with('user')->find($createdPost->id));
    }

Я ожидаю, что все загруженные изображения будут сохранены в базе данных. Вместо этого выдает ошибку: Invalid argument supplied for foreach(). Поэтому, если я удаляю цикл foreach() и загружаю только одно изображение, оно успешно сохраняется. Как я могу использовать цикл для сохранения нескольких изображений?

ОБНОВИТЬ
На этот вопрос ответил @DelenaMalan в комментариях ниже. Я обновил код в этом вопросе, чтобы другие, ищущие ответы, связанные с этой проблемой, могли использовать код для решения своей проблемы.

Просто быстрое предположение: JSON.stringify массив файлов перед добавлением его в formData

Thomas 09.04.2019 18:13

Попробуйте это на стороне интерфейса: this.state.imageArray.forEach((image_file) => { formData.append('file[]', image_file); });

D Malan 09.04.2019 18:19

Спасибо @DelenaMalan. Это сработало как шарм :)

Israel Obanijesu 09.04.2019 18:43

Рад слышать @IsraelObanijesu, я опубликую это как ответ.

D Malan 10.04.2019 09:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
4
3 772
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На стороне внешнего интерфейса вы можете использовать formData.append('file[]', image_file) для добавления файлов изображений в массив file в данных формы, например:

this.state.imageArray.forEach((image_file) => {
    formData.append('file[]', image_file);
});

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