如何使用 Vapor 提供静态文件?
How to serve static files using Vapor?
我正在尝试使用 Swift 和 Vapor 框架编写服务器端应用程序。但是,我不知道如何使用 Vapor 提供静态文件。仅仅将它们移动到 Public
或 Resources
目录是不够的。
我该怎么做?
UPD.
我执行了 Tanner Nelson 建议的步骤,但仍然无效。
到目前为止我尝试了什么:
vapor build
和 vapor run
(使用 Vapor Toolbox v0.6.1)。
./build/debug/App
来自根目录(包含 Package.swift
)。
运行 在 Xcode 8 beta 中按照 Tanner Nelson 建议编辑方案后。
在所有这些情况下我都会出错
{"error":true,"message":"Page not found"}
我在 Public
文件夹中有文件 vapor_logo.png
,在 Public/images/
文件夹中也有相同的文件。我尝试请求它但它失败了。我提出的要求:http://localhost:8080/image/vapor_logo.png
和 http://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")
)
}
我正在尝试使用 Swift 和 Vapor 框架编写服务器端应用程序。但是,我不知道如何使用 Vapor 提供静态文件。仅仅将它们移动到 Public
或 Resources
目录是不够的。
我该怎么做?
UPD. 我执行了 Tanner Nelson 建议的步骤,但仍然无效。
到目前为止我尝试了什么:
vapor build
和vapor run
(使用 Vapor Toolbox v0.6.1)。./build/debug/App
来自根目录(包含Package.swift
)。运行 在 Xcode 8 beta 中按照 Tanner Nelson 建议编辑方案后。
在所有这些情况下我都会出错
{"error":true,"message":"Page not found"}
我在 Public
文件夹中有文件 vapor_logo.png
,在 Public/images/
文件夹中也有相同的文件。我尝试请求它但它失败了。我提出的要求:http://localhost:8080/image/vapor_logo.png
和 http://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")
)
}