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

时间:2016-07-11 18:09:30

标签: swift vapor

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

我该怎么做?

UPD。 我执行了Tanner Nelson建议的步骤,但它仍然没有奏效。

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

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

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

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

  5. 在所有这些情况下,我都会收到错误 {"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的回答确保所请求文件的名称完全与磁盘上文件的名称相匹配。

3 个答案:

答案 0 :(得分:19)

来自Docs的Vapor文件夹结构:

.
├── App
│   └── main.swift
│   └── ...
├── Public
├── Resources
└── Package.swift

如果没有注册的路由与文件名冲突,则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 working directory

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

答案 1 :(得分:4)

对我来说,它在configure.swift中未注释此行:

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

答案 2 :(得分:4)

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

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