![](/img/trans.png)
[英]How to cache static files when using Vapor framework for Swift
[英]How to serve static files using Vapor?
我正在嘗試使用 Swift 和 Vapor 框架編寫服務器端應用程序。 但是,我不知道如何使用 Vapor 提供靜態文件。 僅僅將它們移動到Public
或Resources
目錄是不夠的。
我該怎么做?
更新。 我執行了 Tanner Nelson 建議的步驟,但它仍然不起作用。
到目前為止我嘗試過的:
vapor build
和vapor run
(使用 Vapor Toolbox v0.6.1)。
./build/debug/App
從根目錄(包含Package.swift
)。
按照 Tanner Nelson 的建議,在編輯方案后在 Xcode 8 beta 中運行。
在所有這些情況下,我都會收到錯誤{"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
請求將返回"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
除了FileMiddleware
的答案FileMiddleware
,有時需要提供特定文件而不是整個Public
目錄,這就是使用request.fileio.streamFile
可以提供幫助的地方:
app.get("file") { (request: Request) in
// stream the file
request.eventLoop.makeSucceededFuture(
request.fileio.streamFile(at: "/your/filepath")
)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.