我正在尝试使用Swift和Vapor框架编写服务器端应用程序。但是,我无法弄清楚如何使用Vapor提供静态文件。将它们移动到Public
或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的回答确保所请求文件的名称完全与磁盘上文件的名称相匹配。
答案 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所在的位置)。
要在从命令行运行时进行修复,请确保从根目录运行该应用程序。即,运行命令看起来应该像.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")
)
}