** FIRST ENSURE THAT YOU HAVE NEXT JS PROJECT**
THEN INSTALL THESE PACKAGE
npm i multer npm i path
BACK-END
api\upload.ts
import { NextApiRequest, NextApiResponse } from "next"; import multer from "multer"; import path from "path"; export const config = { api: { bodyParser: false, }, }; const storage = multer.diskStorage({ destination: (req, file, cb) => { const dateFolder = new Date().toISOString().split("T")[0]; // Use date as the folder name const uploadPath = path.join("./public/uploads", dateFolder); // Create the folder if it doesn't exist require("fs").mkdirSync(uploadPath, { recursive: true }); cb(null, uploadPath); }, filename: (req, file, cb) => { cb( null, `${file.fieldname}-${Date.now()}${file.originalname.substring( file.originalname.lastIndexOf(".") )}` ); }, }); const upload = multer({ storage }); const uploadApi = async (req: NextApiRequest, res: NextApiResponse) => { try { await new Promise<void>((resolve, reject) => { upload.single("image")(req as any, res as any, (err) => { if (err) { return reject(err); } resolve(); }); }); // Access the 'file' property after the multer middleware processes the file const uploadedFile = req.file; if (!uploadedFile) { return res.status(400).json({ error: "No file uploaded" }); } // Assuming the uploaded file is saved in the public/uploads folder const dateFolder = new Date().toISOString().split("T")[0]; const fileName = uploadedFile.filename; const filePath = path.join("uploads", dateFolder, fileName); res.status(200).json({ message: "Image uploaded successfully", filePath }); } catch (error) { console.log(error); res.status(500).json({ error: "Error uploading image" }); } }; export default uploadApi;
next.config.js
async rewrites() { return [ { source: "/uploads/:path*", destination: "/uploads/:path*", // Adjust this path based on your project structure }, ]; },
** FRONT-END **
components\UploadForm.tsx
// Your React component import React, { useState } from "react"; const UploadForm = () => { const [file, setFile] = useState<any>(null); const handleFileChange = (e: any) => { setFile(e.target.files[0]); }; const handleUpload = async () => { const formData = new FormData(); formData.append("image", file); try { const response = await fetch("/api/upload", { method: "POST", body: formData, }); if (response.ok) { // Parse the JSON response const responseData = await response.json(); // Access the data from the server console.log("Image uploaded successfully", responseData); } else { console.error("Error uploading image"); } } catch (error) { console.error("Error uploading image", error); } }; return ( <div> <input type="file" onChange={handleFileChange} /> <button onClick={handleUpload}>Upload</button> </div> ); }; export default UploadForm;
Top comments (2)
Is it work, after the production build??
I'm getting
Property 'file' does not exist on type 'NextApiRequest'
onreq.file
.Though I have
@types/multer
installed.