deno.com

HTTP 服务器:文件上传

一个提供文件上传发送和接收功能的 HTTP 服务器示例。

此示例过于简化,仅用于演示目的
在“现实世界”中,表单应进行验证(特别是文件类型),并防止跨站请求伪造。

import { unescape } from "jsr:@std/html/entities";
设置一个异步函数以与 Deno.serve() 一起使用。
async function handler(req: Request) {
从传入的请求(Request)中获取方法。默认是 GET 请求。
  const method: string = req.method;
响应 POST 请求,当下方创建的表单被提交时,我们会收到该请求。
  if (method === "POST") {
从提交的 FormData 中获取文件。
    const formData: FormData = await req.formData();
    const file: File | null = formData?.get("file") as File;
如果未收到文件,则以 400 状态码和解释消息进行响应。
    if (!file) {
      return new Response("File required but not provided.", { status: 400 });
    }
在这里,你可以对接收到的文件进行更多操作。在此示例中,我们仅响应文件名和原始文件字节码。
    return new Response(
      `File name: ${file.name} \n File content: ${await file.bytes()}`,
    );
  }
对于除 POST 之外的所有其他请求(例如 GET),我们创建一个 HTML 表单元素,其 encType 为 'multipart/form-data',并包含一个供用户从其计算机中选择文件的输入字段。
  const inputForm = `
    <form method="POST" enctype="multipart/form-data">
      <input name="file" type="file" />
      <button type="submit">Upload</button>
    </form>
  `;
我们需要指定 'text/html' Content-Type 来实际渲染 HTML 表单。这通常由 Web 框架处理,此示例旨在展示使用 Deno 通过 HTTP 处理文件上传的最简单方法。
  const responseOptions: RequestInit = {
    headers: {
      "Content-Type": "text/html",
    },
  };
注意:我们在这里仅使用 unescape(),因为我们的 HTML 字符串已为文档显示进行了编码。
  return new Response(unescape(inputForm), responseOptions);
}
最后,我们将创建的处理程序传递给 Deno.serve()。
Deno.serve(handler);

在本地使用 Deno CLI 运行此示例

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

您找到所需内容了吗?

隐私政策