Uploading images in Next.js is a common task when developing web applications. In this tutorial, we will explore two different approaches:
First, let's see how you can handle file uploads directly in Next.js without using external services.
Create a form in your desired component to select and upload an image. Here, we use useState to store the file and fetch to send it to the backend.
import { useState } from 'react'; export default function UploadForm() { const [selectedFile, setSelectedFile] = useState(null); const handleFileChange = (event) => { setSelectedFile(event.target.files[0]); }; const handleSubmit = async (event) => { event.preventDefault(); const formData = new FormData(); formData.append('file', selectedFile); const response = await fetch('/api/upload', { method: 'POST', body: formData, }); if (response.ok) { console.log('File uploaded successfully'); } else { console.error('Error uploading file'); } }; return (); }
Now, create an endpoint in Next.js to process the image in the backend. We will use Next.js' API routes to handle server-side operations.
Create a file in pages/api/upload.js:
import fs from 'fs'; import path from 'path'; export const config = { api: { bodyParser: false, // Disable bodyParser to handle large files }, }; export default async function handler(req, res) { if (req.method === 'POST') { const chunks = []; req.on('data', (chunk) => { chunks.push(chunk); }); req.on('end', () => { const buffer = Buffer.concat(chunks); const filePath = path.resolve('.', 'uploads', 'image.png'); // Saves to the `uploads` folder fs.writeFileSync(filePath, buffer); res.status(200).json({ message: 'File uploaded successfully' }); }); } else { res.status(405).json({ message: 'Method not allowed' }); } }
Make sure you have a folder called uploads in the root of your project. You can create it manually:
mkdir uploads
With this, you can now select an image and upload it directly to your server.
Now, if you prefer using an external service like Filestack, which offers file hosting, CDN, and efficient image handling, here's how you can do it.
First, we need to install the Filestack package in your Next.js project.
npm install filestack-js
Next, let's set up the Filestack widget in a component so that users can select and upload images. This is straightforward, as Filestack provides a ready-to-use widget.
Here’s an example implementation:
import { useState } from 'react'; import * as filestack from 'filestack-js'; const client = filestack.init('YOUR_API_KEY'); // Replace with your API Key export default function FilestackUpload() { const [imageUrl, setImageUrl] = useState(''); const handleUpload = async () => { const result = await client.picker({ onUploadDone: (res) => { setImageUrl(res.filesUploaded[0].url); console.log('File uploaded: ', res.filesUploaded[0].url); }, }).open(); }; return ({imageUrl && }); }
For Filestack to work, you need to create an account on Filestack and generate your API Key. Replace YOUR_API_KEY in the code above with the one provided to you.
Once the user uploads an image, you can display it using the URL generated by Filestack:
{imageUrl && }
And that’s it! You now have two approaches to handle image uploads in a Next.js application:
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3