Я пытаюсь создать форму с помощью React, чтобы пользователь мог ввести данные книги, включая название, автора и изображение или обложку книги. Я пытаюсь использовать обычные теги формы, которые включают тег input типа file, но не отправляю форму с помощью атрибута action, вместо этого создаю метод onSubmit.
Я попытался отправить изображение в теле формы вместе с другими полями, но это просто продолжает сбой сервера. Обратите внимание, что я использую Cloudinary для загрузки файлов. Я пытался отправить изображение в files явно в запросе, но это не сработало.
Не стесняйтесь посмотреть следующие скриншоты
мой клиентская часть: (https://i.sstatic.net/IY0ht5rW.png)
ввод изображения: (https://i.sstatic.net/VSbqmpth.png)
моя бедная попытка обработать только изображение: введите описание изображения здесь
Я пытался использовать multer для обработки файла, но не удалось
Ответ
Для загрузки изображений с клиентской стороны и сохранения URL в базе данных, вам нужно настроить как фронтенд, так и бэкенд. В данном случае вы используете React для фронтенда и, предположим, Express.js для бэкенда. Кроме того, вы будете использовать Cloudinary для хранения изображений. Давайте разберем процесс шаг за шагом.
Шаг 1: Настройка фронтенда с React
- Убедитесь, что у вас установлен React и создайте форму для ввода данных о книге.
import React, { useState } from 'react';
import axios from 'axios';
const BookForm = () => {
const [title, setTitle] = useState('');
const [author, setAuthor] = useState('');
const [image, setImage] = useState(null);
const handleImageChange = (event) => {
setImage(event.target.files[0]);
};
const handleSubmit = async (event) => {
event.preventDefault();
const formData = new FormData();
formData.append('title', title);
formData.append('author', author);
formData.append('image', image);
try {
const response = await axios.post('http://your-backend-url/api/books', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
});
console.log(response.data);
} catch (error) {
console.error('Error uploading the book:', error);
}
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
placeholder="Title"
value={title}
onChange={(e) => setTitle(e.target.value)}
required
/>
<input
type="text"
placeholder="Author"
value={author}
onChange={(e) => setAuthor(e.target.value)}
required
/>
<input
type="file"
onChange={handleImageChange}
required
/>
<button type="submit">Submit</button>
</form>
);
};
export default BookForm;
Шаг 2: Настройка бэкенда с Express и Cloudinary
- Установите необходимые пакеты:
npm install express multer cloudinary multer-storage-cloudinary dotenv cors
- Настройте вашу переменную окружения в файле
.env
с учетными данными Cloudinary:
CLOUDINARY_URL=your_cloudinary_url
- Создайте сервер с обработкой загрузки файлов:
const express = require('express');
const dotenv = require('dotenv');
const cloudinary = require('cloudinary').v2;
const multer = require('multer');
const { CloudinaryStorage } = require('multer-storage-cloudinary');
const cors = require('cors');
dotenv.config();
const app = express();
app.use(cors());
cloudinary.config({
cloud_name: 'your_cloud_name',
api_key: 'your_api_key',
api_secret: 'your_api_secret'
});
const storage = new CloudinaryStorage({
cloudinary: cloudinary,
params: {
folder: 'books',
allowed_formats: ['jpg', 'png', 'jpeg'],
},
});
const upload = multer({ storage: storage });
app.post('/api/books', upload.single('image'), async (req, res) => {
try {
const { title, author } = req.body;
const imageUrl = req.file.path; // URL загруженного изображения
// Здесь можно добавить логику для сохранения данных о книге в базу данных
// Например, используя MongoDB
return res.status(200).json({ title, author, image: imageUrl });
} catch (error) {
return res.status(500).json({ error: 'Ошибка загрузки книги' });
}
});
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
Шаг 3: Тестирование
Теперь ваше приложение должно работать следующим образом:
- Пользователь заполняет форму и загружает изображение.
- Форма отправляет
POST
запрос на ваш бэкенд с данными о книге и изображением. - Бэкэнд загружает изображение в Cloudinary и возвращает URL загруженного изображения.
- Вы можете сохранить эту информацию в своей базе данных (например, в MongoDB).
Проверьте, чтобы все URL-адреса и ключи API Cloudinary были корректными. Также убедитесь, что вы открыли CORS в вашем сервере для обработки запросов с вашего фронтенда.
Заключение
Теперь у вас есть полностью рабочий пример загрузки изображений на клиентской стороне с использованием React и их обработки на сервере с использованием Express и Cloudinary. Просмотрите все шаги еще раз и убедитесь, что у вас нет опечаток в коде и правильные настройки окружения.