文件服务器

概念

概述

通过网络发送文件是一个常见的需求。如在 获取数据示例 中所示,由于文件的大小可以是任意的,因此使用流防止将整个文件加载到内存中至关重要。

示例

命令: deno run --allow-read --allow-net file_server.ts

//在本地主机的8080端口上开始监听。
const server = Deno.listen({ port: 8080 });
console.log("文件服务器运行在http://localhost:8080/");

for await (const conn of server) {
  handleHttp(conn).catch(console.error);
}

async function handleHttp(conn: Deno.Conn) {
  const httpConn = Deno.serveHttp(conn);
  for await (const requestEvent of httpConn) {
    // 将请求的路径名用作文件路径
    const url = new URL(requestEvent.request.url);
    const filepath = decodeURIComponent(url.pathname);

    //尝试打开文件
    let file;
    try {
      file = await Deno.open("." + filepath, { read: true });
    } catch {
      //如果无法打开文件,则返回“404 Not Found”响应
      const notFoundResponse = new Response("404 Not Found", { status: 404 });
      await requestEvent.respondWith(notFoundResponse);
      continue;
    }

    //构建可读流,这样我们可以在发送文件时不必完全加载到内存中
    const readableStream = file.readable;

    //构建并发送响应
    const response = new Response(readableStream);
    await requestEvent.respondWith(response);
  }
}

使用 std/http 文件服务器

Deno 标准库为您提供了 file server ,使 您无需编写自己的服务器。

要使用它,首先将远程脚本安装到本地文件系统。这将 将脚本安装到 Deno 安装根 bin 目录,例如 /home/alice/.deno/bin/file_server

deno install --allow-net --allow-read https://deno.land/std@$STD_VERSION/http/file_server.ts

现在,您可以使用简化的脚本名称运行该脚本。运行它:

$ file_server .
Downloading https://deno.land/std@$STD_VERSION/http/file_server.ts...
[...]
HTTP server listening on http://0.0.0.0:4507/

现在,转到您的 Web 浏览器中的 http://0.0.0.0:4507/ ,以查看本地目录内容。

所有选项的完整列表都可通过以下方式获得:

file_server --help

示例输出:

Deno File Server
    Serves a local directory in HTTP.
  INSTALL:
    deno install --allow-net --allow-read https://deno.land/std/http/file_server.ts
  USAGE:
    file_server [path] [options]
  OPTIONS:
    -h, --help          Prints help information
    -p, --port <PORT>   Set port
    --cors              Enable CORS via the "Access-Control-Allow-Origin" header
    --host     <HOST>   Hostname (default is 0.0.0.0)
    -c, --cert <FILE>   TLS certificate file (enables TLS)
    -k, --key  <FILE>   TLS key file (enables TLS)
    --no-dir-listing    Disable directory listing
    All TLS options are required when one is provided.