busboy icon indicating copy to clipboard operation
busboy copied to clipboard

Help needed for uploading files

Open Koikarp8877 opened this issue 1 year ago • 0 comments

Prerequisites

  • [X] I have written a descriptive issue title
  • [X] I have searched existing issues to ensure the issue has not already been raised

Issue

Hello, i'm trying to upload files on my nextjs 14.0.4 app with fastify/busboy, however, while the files upload in the right repo, with the right name and right extension, they are unsuable "Not a JPEG file: starts with 0xef 0xbf", exemple with an jpeg file. I double checked the files are fine. It's my first nextjs app, any help would be greatly aprreciated. Thanks for your time.

import { PrismaClient } from '@prisma/client'; const Busboy = require('@fastify/busboy'); import fs from 'fs'; import path from 'path'; import os from 'os';

const prisma = new PrismaClient();

export const createRessource = async (req, res) => { try {

const bb = new Busboy({ headers: req.headers, limits: { fileSize: 3000000 }, highWaterMark: undefined });
const formData = {};

bb.on('file', (fieldname, file, filename, encoding, mimetype) => {
  console.log(`File [${fieldname}]: filename: ${filename}, encoding: ${encoding}, mimetype: ${mimetype}`);

  const uniqueFilename = `${fieldname}-${Date.now()}-${path.basename(filename)}`;
  const saveTo = path.join('public', 'images', uniqueFilename);
  const buffers = [];

  file.on('data', (data) => {
    buffers.push(data);
    console.log(`File [${filename}] got ${data.length} bytes`);
  });

  file.on('end', () => {
    console.log(`File [${filename}] Finished`);
    const fileData = Buffer.concat(buffers);
    fs.writeFileSync(saveTo, fileData);
    console.log(`File [${filename}] save to [${saveTo}]`);
    formData[fieldname] = {
      filename: uniqueFilename,
      path: saveTo,
      mimetype: mimetype
    };
  });
});

bb.on('field', (fieldname, val) => {
  console.log(`Field [${fieldname}]: value: ${val}`);
  formData[fieldname] = val;
});

bb.on('finish', async () => {
  console.log('Done parsing form!');

  const { titre, contenu, categorieName, visibilite, filefield } = formData;
  const fileInfo = formData[filefield];

  const currentDate = new Date();

  const newRessource = await prisma.t_ressource.create({
    data: {
      ressource_titre: titre,
      ressource_date: currentDate,
      ressource_contenu: contenu,
      id_categorie: categorieName,
      ressource_media: fileInfo,
      ressource_visibilite: visibilite,
    },
  });

  console.log('Ressource créée:', newRessource);
  console.log('Nom du fichier :', fileInfo);

  res.json({
    success: true,
    message: 'Ressource créée avec succès',
    ressource: newRessource,
  });
});

bb.on('error', (err) => {
  console.error('Erreur lors du traitement du formulaire :', err);
  res.status(500).json({
    success: false,
    message: 'Erreur lors du traitement du formulaire',
  });
});

req.once('data', (chunk) => {
  bb.write(chunk);
});

bb.end(req.body);

} catch (error) { console.error('Erreur lors de la création de la ressource:', error); res.status(500).json({ success: false, message: 'Erreur lors de la création de la ressource', }); } finally { await prisma.$disconnect(); } }

My Environment

node version: v20.11.0
fastify version: >=2.0.0
os: Linux
Nextjs 14.0.4, prisma.

Koikarp8877 avatar Mar 13 '24 10:03 Koikarp8877