跳转到主要内容
在本页

编写文件服务器

文件服务器侦听传入的 HTTP 请求,并从本地文件系统提供文件。本教程演示了如何使用 Deno 内置的文件系统 API 创建一个简单的文件服务器。

编写一个简单的文件服务器 跳转到标题

首先,创建一个名为 file-server.ts 的新文件。

我们将使用 Deno 内置的 HTTP 服务器来侦听传入的请求。在您的新 file-server.ts 文件中,添加以下代码

file-server.ts
Deno.serve(
  { hostname: "localhost", port: 8080 },
  (request) => {
    const url = new URL(request.url);
    const filepath = decodeURIComponent(url.pathname);
  },
);

如果您不熟悉 URL 对象,您可以在 URL API 文档中了解更多信息。decodeURIComponent 函数 用于解码 URL 编码的路径,以防字符已被百分比编码。

打开文件并流式传输其内容 跳转到标题

当收到请求时,我们将尝试使用 Deno.open 打开请求 URL 中指定的文件。

如果请求的文件存在,我们将使用 ReadableStream API 将其转换为可读数据流,并将内容流式传输到响应中。 我们不知道请求的文件可能有多大,因此对其进行流式传输可以防止在同时提供大型文件或多个请求时出现内存问题。

如果文件不存在,我们将返回“404 未找到”响应。

在请求处理程序的主体中,在两个变量下方添加以下代码

try {
  const file = await Deno.open("." + filepath, { read: true });
  return new Response(file.readable);
} catch {
  return new Response("404 Not Found", { status: 404 });
}

运行文件服务器 跳转到标题

使用 deno run 命令运行新的文件服务器,并允许读取访问和网络访问

deno run --allow-read=. --allow-net file-server.ts

使用 Deno 标准库提供的文件服务器 跳转到标题

从头编写文件服务器是了解 Deno 的 HTTP 服务器如何工作的一个很好的练习。 然而,从头开始编写生产就绪的文件服务器可能会很复杂且容易出错。 最好使用经过测试且可靠的解决方案。

Deno 标准库为您提供了一个 文件服务器,因此您不必自己编写。

要使用它,首先将远程脚本安装到本地文件系统

# Deno 1.x
deno install --allow-net --allow-read jsr:@std/http@1/file-server
# Deno 2.x
deno install --global --allow-net --allow-read jsr:@std/http@1/file-server

这会将脚本安装到 Deno 安装根目录的 bin 目录,例如 /home/user/.deno/bin/file-server

现在您可以使用简化的脚本名称运行脚本

$ file-server .
Listening on:
- Local: http://0.0.0.0:8000

要查看文件服务器可用的完整选项列表,请运行 file-server --help

如果您在 Web 浏览器中访问 http://0.0.0.0:8000/,您将看到本地目录的内容。

在 Deno 项目中使用 @std/http 文件服务器 跳转到标题

要在 Deno 项目 中使用文件服务器,您可以使用以下代码将其添加到 deno.json 文件中

deno add jsr:@std/http

然后将其导入您的项目中

file-server.ts
import { serveDir } from "@std/http/file-server";

Deno.serve((req) => {
  const pathname = new URL(req.url).pathname;
  if (pathname.startsWith("/static")) {
    return serveDir(req, {
      fsRoot: "path/to/static/files/dir",
    });
  }
  return new Response();
});

此代码将使用 Deno.serve 设置 HTTP 服务器。 当请求传入时,它会检查请求的路径是否以“/static”开头。 如果是,它会提供指定目录中的文件。 否则,它会以空响应进行响应。

🦕 现在您知道了如何编写自己的简单文件服务器,以及如何使用 Deno 标准库提供的文件服务器实用程序。 您已准备好应对各种任务 - 无论是提供静态文件、处理上传、转换数据还是管理访问控制 - 您都可以使用 Deno 提供文件。