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