Загрузите изображения с клиентской стороны и сохраните URL в базе данных

Вопросы и ответы

Я пытаюсь создать форму с помощью 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

  1. Убедитесь, что у вас установлен 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

  1. Установите необходимые пакеты:
npm install express multer cloudinary multer-storage-cloudinary dotenv cors
  1. Настройте вашу переменную окружения в файле .env с учетными данными Cloudinary:
CLOUDINARY_URL=your_cloudinary_url
  1. Создайте сервер с обработкой загрузки файлов:
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: Тестирование

Теперь ваше приложение должно работать следующим образом:

  1. Пользователь заполняет форму и загружает изображение.
  2. Форма отправляет POST запрос на ваш бэкенд с данными о книге и изображением.
  3. Бэкэнд загружает изображение в Cloudinary и возвращает URL загруженного изображения.
  4. Вы можете сохранить эту информацию в своей базе данных (например, в MongoDB).

Проверьте, чтобы все URL-адреса и ключи API Cloudinary были корректными. Также убедитесь, что вы открыли CORS в вашем сервере для обработки запросов с вашего фронтенда.

Заключение

Теперь у вас есть полностью рабочий пример загрузки изображений на клиентской стороне с использованием React и их обработки на сервере с использованием Express и Cloudinary. Просмотрите все шаги еще раз и убедитесь, что у вас нет опечаток в коде и правильные настройки окружения.

Оцените материал
Добавить комментарий

Капча загружается...