You thought handling post data and zero-config api routes are awesome? How about easy-peasy file uploads?
#handle » upload
To enable file uploads, we'll accompany the post
handler with an upload
handler. Together, they'll be responsible for handling multipart form
submissions.
import fs from 'fs'; import { handle, json } from 'next-runtime'; export const getServerSideProps = handle({ async upload({ file, stream }) { stream.pipe(fs.createWriteStream(`/uploads/${file.name}`)); }, async post({ req: { body } }) { return json({ message: 'Thanks, file accepted!' }); }, });
The upload
handler gets a file object containing name, type and size
properties, as well as a readable stream. Either use the stream to write the
file to your file system, or pipe it to an object store like S3.
If you wish to store the file locally, you might also simply specify the
uploadDir
instead, and let next-runtime
handle the writing for you. More
about that, on the api pages.
Possibly unnecessary, but here's a form that could be submitting data to this handler:
export default function MyPage({ name, message }) { if (message) { return <p>{message}</p>; } return ( <form method="post" encType="multipart/form-data"> <input name="file" type="file" /> <button type="submit">submit</button> </form> ); }
Don't forget to specify encType="multipart/form-data"
when adding file inputs.
Just as with the standard post
handler, this form can be upgraded to a Form
as well. Please see
data updates - upgrading to form
for how to do that.