Multiparser
A Deno module for parsing multipart/form-data
Features:
- Very simple API
- Maximum file size option
- Easy to understand examples
Usage
const form = await multiParser(request, maxMem?)
request: serverRequest
is a raw server request coming from Deno http module.
maxMem: number
maximum memory size to store file in memory, unit: byte
- default
10485760
bytes (10MB)
Return value:
Returned valud can either be
- a object with
string
,FormFile
,FormFile[]
(array ofFormFile
) undefined
A sample returned form value:
{
title: "123145",
singleFile: {
filename: "small.png",
type: "image/png",
content: Uint8Array(6229) [
137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68,
... 6129 more items
],
size: 6229
}
}
Here we can see
title
is a form field name, and its value is a string"123145"
singleFile
is a form field name, and its value is the type ofFormFile
,
Where:
interface FormFile {
/** filename */
filename: string;
/** content-type header value of file */
type: string;
/** byte size of file */
size: number;
/** in-memory content of file. Either content or tempfile is set */
content?: Uint8Array;
}
The content
can be used to write file content to local disk by using Deno.writeFile(<FileName>, <content>)
Examples
With Deno http module
import { serve } from "https://deno.land/std/http/server.ts";
import { multiParser } from 'https://deno.land/x/multiparser/mod.ts'
const s = serve({ port: 8000 });
for await (const req of s) {
if (req.url === "/upload") {
const form = await multiParser(req)
if (form) {
console.log(form)
}
}
req.respond({
headers: new Headers({ "Content-Type": "text/html; charset=utf-8" }),
body: `
<h3>Deno http module</h3>
<form action="/upload" enctype="multipart/form-data" method="post">
<div>Text field title: <input type="text" name="title" /></div>
<div>File: <input type="file" name="singleFile"/></div>
<input type="submit" value="Upload" />
</form>
` });
}
With Oak framework
import { Application, Context } from "https://deno.land/x/oak/mod.ts";
import { multiParser } from 'https://deno.land/x/multiparser/mod.ts'
const app = new Application();
app.use(async (ctx) => {
if (ctx.request.url.pathname === '/upload') {
const form = await multiParser(ctx.request.serverRequest)
if (form) {
console.log(form)
}
}
ctx.response.headers.set("Content-Type", "text/html; charset=utf-8")
ctx.response.body = `
<h3>Deno Oak framework</h3>
<form action="/upload" enctype="multipart/form-data" method="post">
<div>Text field title: <input type="text" name="title" /></div>
<div>File: <input type="file" name="singleFile"/></div>
<input type="submit" value="Upload" />
</form>
`
});
await app.listen({ port: 8000 });