deno.com
本页内容

编写文件服务器

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

编写一个简单的文件服务器 Jump to heading

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

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

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

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

打开文件并流式传输其内容 Jump to heading

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

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

如果文件不存在,我们将返回“404 Not Found”响应。

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

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

运行文件服务器 Jump to heading

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

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

使用 Deno 标准库提供的文件服务器 Jump to heading

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

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

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

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

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

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

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

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

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

在 Deno 项目中使用 @std/http 文件服务器 Jump to heading

要在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 提供文件服务。

您找到所需内容了吗?

隐私政策