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

Ale*_*loz 13 swift vapor

我正在尝试使用Swift和Vapor框架编写服务器端应用程序.但是,我无法弄清楚,如何使用Vapor提供静态文件.将它们移动到Publicor Resources目录是不够的.

我怎样才能做到这一点?

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

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

  1. vapor buildvapor run(使用Vapor Toolbox v.6.6).

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

  3. Tanner Nelson建议,在编辑方案后运行Xcode 8 beta.

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

我有vapor_logo.png一个Public文件夹里面的文件,也有文件夹里面的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的回答,并确保所请求文件的名称与磁盘上的文件名完全匹配.

tan*_*101 20

来自Docs的 Vapor文件夹结构:

.
??? App
?   ??? main.swift
?   ??? ...
??? Public
??? Resources
??? Package.swift
Run Code Online (Sandbox Code Playgroud)

Public如果没有注册的路径与文件名冲突,则默认情况下将提供该文件夹中的所有文件.

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

import Vapor

let drop = Droplet()

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

drop.serve()
Run Code Online (Sandbox Code Playgroud)

的请求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文件夹位于根目录下.


m8l*_*abs 8

对我来说,这是取消注释这一行configure.swift

middlewares.use(FileMiddleware.self) // Serves files from `Public` directory
Run Code Online (Sandbox Code Playgroud)


Max*_*tov 6

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

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