#javascript #php #reactjs #laravel #laravel-5.8
#javascript #php #reactjs #laravel #laravel-5.8
Вопрос:
Я хочу загрузить несколько изображений в базу данных, используя 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);
}
HanleFileChange:
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);
}
}
Обрабатывает Submitchange:
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.log(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 ответил на этот вопрос в комментариях ниже. Я обновил код в этом вопросе, чтобы другие, ищущие ответы, связанные с этой проблемой, могли использовать код для решения своей проблемы.
Комментарии:
1. Просто быстрое предположение:
JSON.stringify
массив файлов перед добавлением его вformData
2. Попробуйте это на стороне интерфейса:
this.state.imageArray.forEach((image_file) => { formData.append('file[]', image_file); });
3. Спасибо @DelenaMalan. Это сработало как шарм 🙂
4. Рад слышать @IsraelObanijesu, я опубликую это в качестве ответа.
Ответ №1:
На вашей стороне интерфейса вы могли бы использовать formData.append('file[]', image_file)
, например, для добавления файлов изображений в file
массив данных формы:
this.state.imageArray.forEach((image_file) => {
formData.append('file[]', image_file);
});