我正在尝试使用Swift和Vapor框架编写服务器端应用程序.但是,我无法弄清楚,如何使用Vapor提供静态文件.将它们移动到Publicor Resources目录是不够的.
我怎样才能做到这一点?
UPD. 我执行了Tanner Nelson建议的步骤,但它仍然无效.
到目前为止我尝试了什么:
vapor build和vapor run(使用Vapor Toolbox v.6.6).
./build/debug/App从根目录(包含Package.swift).
Tanner Nelson建议,在编辑方案后运行Xcode 8 beta.
在所有这些情况下我都会收到错误
{"error":true,"message":"Page not found"}
我有vapor_logo.png一个Public文件夹里面的文件,也有文件夹里面的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的回答,并确保所请求文件的名称与磁盘上的文件名完全匹配.
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所在的位置).
要在从命令行运行时进行修复,请确保从根目录运行该应用程序.即,运行命令应该是这个样子.build/debug/App,因为该.build文件夹位于根目录下.
对我来说,这是取消注释这一行configure.swift:
middlewares.use(FileMiddleware.self) // Serves files from `Public` directory
Run Code Online (Sandbox Code Playgroud)
除了使用的答案外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)
| 归档时间: |
|
| 查看次数: |
3432 次 |
| 最近记录: |