Para fazer upload de arquivos via HTTP com Bun, use a API FormData. Vamos começar com um servidor HTTP que serve um simples formulário HTML.
const server = Bun.serve({
port: 4000,
async fetch(req) {
const url = new URL(req.url);
// retorna index.html para o caminho raiz
if (url.pathname === "/")
return new Response(Bun.file("index.html"), {
headers: {
"Content-Type": "text/html",
},
});
return new Response("Not Found", { status: 404 });
},
});
console.log(`Listening on http://localhost:${server.port}`);Podemos definir nosso formulário HTML em outro arquivo, index.html.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Form</title>
</head>
<body>
<form action="/action" method="post" enctype="multipart/form-data">
<input type="text" name="name" placeholder="Name" />
<input type="file" name="profilePicture" />
<input type="submit" value="Submit" />
</form>
</body>
</html>Neste ponto, podemos executar o servidor e visitar localhost:4000 para ver nosso formulário.
bun run index.ts
Listening on http://localhost:4000Nosso formulário enviará uma requisição POST para o endpoint /action com os dados do formulário. Vamos lidar com essa requisição em nosso servidor.
Primeiro usamos o método .formData() na Request recebida para analisar seu conteúdo de forma assíncrona para uma instância FormData. Então podemos usar o método .get() para extrair o valor dos campos name e profilePicture. Aqui name corresponde a uma string e profilePicture é um Blob.
Finalmente, escrevemos o Blob em disco usando Bun.write().
const server = Bun.serve({
port: 4000,
async fetch(req) {
const url = new URL(req.url);
// retorna index.html para o caminho raiz
if (url.pathname === "/")
return new Response(Bun.file("index.html"), {
headers: {
"Content-Type": "text/html",
},
});
// analisa formdata em /action
if (url.pathname === "/action") {
const formdata = await req.formData();
const name = formdata.get("name");
const profilePicture = formdata.get("profilePicture");
if (!profilePicture) throw new Error("Must upload a profile picture.");
// escreve profilePicture em disco
await Bun.write("profilePicture.png", profilePicture);
return new Response("Success");
}
return new Response("Not Found", { status: 404 });
},
});