提供文件下载 封面
Vapor 大型教程

提供文件下载

静态资源应该由明确的目录提供,而不是让路由随意读取文件。这里配置 FileMiddleware,把 Public 目录安全地映射到下载请求。

一、什么是文件服务

几乎每一个网站都需要存放一些静态文件,例如图片和样式表文件。通常这需要 CDN 或 Nginx/Apache 来托管,而 Vapor 提供了 FileMiddleware 模块来完成这些事情。

要使用文件服务中间件,需要在 configure.swift 里注册它。默认使用 Public 目录作为文件服务的根目录,里面的文件可以是图片、样式表等:

...
    var middlewares = MiddlewareConfig() // Create _empty_ middleware config
    /// middlewares.use(FileMiddleware.self) // Serves files from `Public/` directory
    middlewares.use(ErrorMiddleware.self) // Catches errors and converts to HTTP response
    middlewares.use(FileMiddleware.self) //
    services.register(middlewares)
...
小提示:FileMiddleware 默认只服务 Public/ 目录。把文件放进这里,浏览器就能通过根路径直接访问,例如 /images/logo.png。

二、在页面里引用静态文件

在 Public 目录下放置一张图片,比如 Public/images/logo.png,然后修改 index.leaf,用相对路径引用它:

...
<img src="/images/logo.png" class = "mx-auto d-block" alt="TIL Logo" />
<h1>Acronyms</h1>
...

这样首页就能显示这张 logo,浏览器访问 /images/logo.png 时,FileMiddleware 会自动把 Public/images/logo.png 返回给客户端——也就是「提供文件下载 / 资源服务」的效果。

安全与缓存注意事项

Public 目录中的内容会被直接暴露,配置前先确认里面没有环境变量、数据库备份或上传后的私密文件。用户上传的文件应保存到独立目录,并通过鉴权路由读取,不能简单地把整个上传目录交给 FileMiddleware。

图片、CSS 等不会频繁变化的资源可以设置长期缓存;部署新版本时给文件名加版本号或哈希,避免浏览器继续使用旧内容。下载接口还应检查文件是否存在,并返回清晰的 404,而不是把底层路径错误暴露给用户。


本系列其他文章