跳到主要内容

文件服务器

概念

  • 使用 Deno.open 以块的方式读取文件内容。
  • 将 Deno 文件转换成 ReadableStream
  • 使用 Deno 集成的 HTTP 服务器来运行您自己的文件服务器。

概览

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

示例

命令: 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 未找到”响应
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 标准库提供了一个 文件服务器,这样您就不必自己编写了。

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

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

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

$ file_server .
正在下载 https://deno.land/std/http/file_server.ts...
[...]
HTTP 服务器正在监听 http://0.0.0.0:4507/

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

完整的选项列表可通过以下方式获取:

file_server --help

示例输出:

Deno 文件服务器
以 HTTP 方式提供本地目录。
安装:
deno install --allow-net --allow-read https://deno.land/std/http/file_server.ts
使用:
file_server [路径] [选项]
选项:
-h, --help 打印帮助信息
-p, --port <PORT> 设置端口
--cors 通过 "Access-Control-Allow-Origin" 标头启用 CORS
--host <HOST> 主机名(默认为 0.0.0.0)
-c, --cert <FILE> TLS 证书文件(启用 TLS)
-k, --key <FILE> TLS 密钥文件(启用 TLS)
--no-dir-listing 禁用目录列表
提供 TLS 选项时,需要提供所有 TLS 选项。