如何使用 Vapor 提供静态文件?

How to serve static files using Vapor?

我正在尝试使用 Swift 和 Vapor 框架编写服务器端应用程序。但是,我不知道如何使用 Vapor 提供静态文件。仅仅将它们移动到 PublicResources 目录是不够的。

我该怎么做?

UPD. 我执行了 Tanner Nelson 建议的步骤,但仍然无效。

到目前为止我尝试了什么:

  1. vapor buildvapor run(使用 Vapor Toolbox v0.6.1)。

  2. ./build/debug/App 来自根目录(包含 Package.swift)。

  3. 运行 在 Xcode 8 beta 中按照 Tanner Nelson 建议编辑方案后。

在所有这些情况下我都会出错 {"error":true,"message":"Page not found"}

我在 Public 文件夹中有文件 vapor_logo.png,在 Public/images/ 文件夹中也有相同的文件。我尝试请求它但它失败了。我提出的要求:http://localhost:8080/image/vapor_logo.pnghttp://localhost:8080/vapor_logo.png。但是,其他路线工作正常。

UPD 2.好吧,这都是我的错误。首先,我认为名为 vapor_logo.png 的文件实际上名为 vapor-logo.png。其次,当你提出请求时,案例很重要。我还尝试请求名称为 IMG_8235.JPG 的文件,但将文件扩展名写为 jpg,所以出现错误。

所以,回顾一下:如果您遇到与我相同的问题,请遵循 Tanner Nelson 的回答并确保所请求文件的名称完全 与磁盘上文件的名称相匹配.

来自 Docs 的 Vapor 文件夹结构:

VaporApp
├── Package.swift
├── Resources
│   ├── Views
│   │   └── hello.leaf
├── Public
│   ├── images (images resources)
│   ├── styles (css resources)
└── Sources
    └── ...

如果没有注册与文件名冲突的路由,默认情况下将提供 Public 文件夹中的任何文件。

例如,如果您有一个文件 Public/foo.png 和以下 main.swift 文件:

import Vapor

let drop = Droplet()

drop.get("welcome") { request in
    return "Hello, world"
}

drop.serve()

localhost/welcome 的请求将 return "Hello, world"localhost/foo.png 的请求将 return foo.png.

如果这不能正常工作,可能是您的工作目录配置不正确。如果您从 Xcode 中 运行 宁您的项目,或者您从不是项目根目录的文件夹中的命令行 运行 宁它,就会发生这种情况。

要修复 Xcode,请转到 Schemes > App > Edit Scheme > Run > Options > Working Directory > [x] Use Custom Working Directory 并确保将目录设置为项目的根目录(Package.swift 所在的目录)。

要修复从命令行 运行ning 的问题,请确保您是从根目录 运行ning 应用程序。即,运行 命令应该类似于 .build/debug/App,因为 .build 文件夹位于根目录中。

对我来说,取消注释 configure.swift 中的这一行:

middlewares.use(FileMiddleware.self) // Serves files from `Public` directory

除了 之外,有时需要提供特定文件而不是整个 Public 目录,这就是使用 request.fileio.streamFile 可以提供帮助的地方:

app.get("file") { (request: Request) in
  // stream the file
  request.eventLoop.makeSucceededFuture(
    request.fileio.streamFile(at: "/your/filepath")
  )
}