Как в Next JS отправить файлы на сервер и указать путь для их сохранения?

Как начать изучение написания серверного приложения для новичка?
  • 25 января 2024 г. 14:08
Ответы на вопрос 2
**Отправка файлов на сервер в Next.js**

Для загрузки файлов на сервер в рамках приложения Next.js вы можете использовать REST API или GraphQL, зависящий от вашего бэкенд решения. В качестве примера давайте рассмотрим отправку файла с помощью API-маршрутов Next.js:

1. Во-первых, вам нужно создать форму загрузки файла в компоненте страницы:

```jsx
<form onSubmit={handleSubmit}>
  <input type="file" name="file" onChange={handleFileChange} />
  <button type="submit">Upload</button>
</form>
```

2. Затем напишите обработчики событий для сохранения выбранного файла и отправки формы:

```jsx
const [file, setFile] = useState(null);

const handleFileChange = (e) => {
  setFile(e.target.files[0]); // сохраните выбранный файл
};

const handleSubmit = async (e) => {
  e.preventDefault();
  if (!file) return;

  const formData = new FormData();
  formData.append('file', file);

  const response = await fetch('/api/upload', {
    method: 'POST',
    body: formData,
  });

  // проверка ответа сервера
  if(response.ok) {
    console.log('Файл успешно загружен');
  } else {
    console.error('Ошибка при загрузке файла');
  }
};
```

3. Создайте API-маршрут в директории `pages/api` для обработки POST-запроса. Например, `pages/api/upload.js`:

```javascript
export default async (req, res) => {
  if (req.method === 'POST') {
    // Обработка загруженного файла
    // `req` содержит файл и данные
    
    // Здесь вам нужно обработать мультипарт-форму. В Next.js для этого нужно
    // использовать сторонние пакеты, например, `formidable` или `multer`
    
    // Например с `formidable`
    const Formidable = require('formidable');
    const fs = require('fs');
    const path = require('path');
    
    const form = new Formidable.IncomingForm();
    form.uploadDir = "./public/uploads"; // указываете, куда сохранять файлы
    form.keepExtensions = true; // сохранять расширения файлов
    
    form.parse(req, (err, fields, files) => {
      if (err) {
        res.status(500).json({ error: err });
        return;
      }
      const filePath = files.file.filepath;
      const newFilePath = path.join(form.uploadDir, files.file.originalFilename);

      // Перемещаем файл из временной директории в указанную
      fs.rename(filePath, newFilePath, (err) => {
        if (err) {
          res.status(500).json({ error: err });
          return;
        }
        res.status(200).json({ message: 'Файл успешно загружен' });
      });
    });
  } else {
    // Обрабатываем другие методы или возвращаем ошибку, если не поддерживается
    res.setHeader('Allow', ['POST']);
    res.status(405).end(`Method ${req.method} Not Allowed`);
  }
};
```

**Как начать изучение написания серверного приложения для новичка**

1. **Основы программирования**: Начните с изучения основных концепций программирования, если вы не знакомы с ними. Вы можете выбрать язык программирования, как Python или JavaScript, которые являются хорошими начальными точками благодаря их простоте и большому сообществу.

2. **Изучение основ веб-разработки**: Понимание базовых принципов веб-разработки, включая HTML, CSS и JavaScript, а также запросы и ответы HTTP.

3. **Основы бэкенд-разработки**: Выбрать фреймворк для бэкен
может кому нибудь пригодится мое решение: 

файл api/upload/route.ts

Похожие вопросы