deno.com

HTTP server: File upload

Edit on Github

An example HTTP server that provides sending and receiving of a file upload.

This example is overly simplified and for demonstration purposes only:
In the "real world" forms should be validated (especially file type) and protect against cross-site request forgery.

import { unescape } from "jsr:@std/html/entities";
Set up an async function to use with Deno.serve().
async function handler(req: Request) {
Get the method from the incoming Request. The default is a GET request.
  const method: string = req.method;
Respond to a POST request which we receive if the form we create below is submitted.
  if (method === "POST") {
Get the file from the submitted FormData.
    const formData: FormData = await req.formData();
    const file: File | null = formData?.get("file") as File;
If we did not receive a file respond with a 400 status code and a message to explain.
    if (!file) {
      return new Response("File required but not provided.", { status: 400 });
    }
Here you would do more with the received file, in this example we're responding with the filename and the raw file byte code.
    return new Response(
      `File name: ${file.name} \n File content: ${await file.bytes()}`,
    );
  }
For all other requests other than POST (e.g. GET), let's create an HTML form element with an encType of 'multipart/form-data' and an input field for the user to select a file from their computer.
  const inputForm = `
    <form method="POST" enctype="multipart/form-data">
      <input name="file" type="file" />
      <button type="submit">Upload</button>
    </form>
  `;
We need to specify the 'text/html' Content-Type to actually render the HTML form, this would normally be handled by a web framework, this example is designed to show the simplest way to handle a file upload over HTTP with Deno.
  const responseOptions: RequestInit = {
    headers: {
      "Content-Type": "text/html",
    },
  };
Note: We are only using unescape() here because our HTML string has been encoded for display in the documentation.
  return new Response(unescape(inputForm), responseOptions);
}
Lastly we pass the handler we created to Deno.serve().
Deno.serve(handler);

Run this example locally using the Deno CLI:

deno run -N https://docs.deno.com/examples/scripts/http_server_file_upload.ts

Did you find what you needed?

Privacy policy