簡體   English   中英

如何使用 Vapor 提供靜態文件?

[英]How to serve static files using Vapor?

我正在嘗試使用 Swift 和 Vapor 框架編寫服務器端應用程序。 但是,我不知道如何使用 Vapor 提供靜態文件。 僅僅將它們移動到PublicResources目錄是不夠的。

我該怎么做?

更新。 我執行了 Tanner Nelson 建議的步驟,但它仍然不起作用。

到目前為止我嘗試過的:

  1. vapor buildvapor run (使用 Vapor Toolbox v0.6.1)。

  2. ./build/debug/App從根目錄(包含Package.swift )。

  3. 按照 Tanner Nelson 的建議,在編輯方案后在 Xcode 8 beta 中運行。

在所有這些情況下,我都會收到錯誤{"error":true,"message":"Page not found"}

我在Public文件夾中有文件vapor_logo.png ,在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 的回答並確保所請求文件的名稱與磁盤上的文件名稱完全匹配。

來自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 所在的位置)。

Xcode 工作目錄

要在從命令行運行時進行修復,請確保從根目錄運行應用程序。 即,運行命令應該類似於.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM