21

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

我怎样才能做到这一点?

UPD。 我执行了 Tanner Nelson 建议的步骤,但它仍然不起作用。

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

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

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

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

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

我在文件夹中有文件vapor_logo.pngPublic文件夹中有相同的文件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 的回答并确保请求的文件名与磁盘上的文件名完全匹配。

4

3 回答 3

35

来自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会返回"Hello, world",一个请求localhost/foo.png会返回foo.png

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

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

Xcode 工作目录

要修复从命令行运行时的问题,请确保从根目录运行应用程序。即,运行命令应该看起来像.build/debug/App,因为该.build文件夹位于根目录中。

于 2016-07-12T14:00:02.407 回答
8

对我来说,这是在以下行中取消注释configure.swift

middlewares.use(FileMiddleware.self) // Serves files from `Public` directory
于 2018-11-24T15:26:41.830 回答
7

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

app.get("file") { (request: Request) in
  // stream the file
  request.eventLoop.makeSucceededFuture(
    request.fileio.streamFile(at: "/your/filepath")
  )
}
于 2020-06-04T20:38:15.467 回答