【问题标题】:How to serve static files using Vapor?如何使用 Vapor 提供静态文件?
【发布时间】:2016-11-13 18:51:45
【问题描述】:

我正在尝试使用 Swift 和 Vapor 框架编写服务器端应用程序。但是,我不知道如何使用 Vapor 提供静态文件。仅仅将它们移动到PublicResources 目录是不够的。

我该怎么做?

UPD。 我执行了 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 的回答并确保请求文件的名称完全与磁盘上的文件名称匹配。

【问题讨论】:

    标签: swift vapor


    【解决方案1】:

    来自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 文件夹位于根目录中。

    【讨论】:

    • 感谢您的回答!但是,它仍然无法正常工作。我对原始问题进行了更新。
    【解决方案2】:

    除了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")
      )
    }
    

    【讨论】:

      【解决方案3】:

      对我来说,这是在 configure.swift 中取消注释这一行:

      middlewares.use(FileMiddleware.self) // Serves files from `Public` directory
      

      【讨论】:

        猜你喜欢
        • 2018-09-21
        • 2014-01-12
        • 2013-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 2012-10-29
        • 2012-07-14
        相关资源
        最近更新 更多