29

我刚开始在流星上使用铁路由器。我需要在主页上显示图像。我能够使用客户端路由为“家”配置路由。对于静态文件,我尝试 google 并发现添加服务器端路由可能会有所帮助。因此,我在服务器的 router.js 上添加了以下代码。

Router.map(function() {
    this.route('files', {
        path: '/files/:path(*)',
        action: function() {
            var path = this.params.path;

            console.log('will serve static content @ '+path);
            this.response.sendfile(path);
        }
    });
});

当我尝试访问http://localhost:3000/files/someImage.png时,它说没有为/files/someImage.png. 难道我做错了什么?有没有其他方法可以使用 Iron 路由器提供静态文件?

4

3 回答 3

61

而不是做这一切,你可以把文件放在你的public目录下。如果添加文件:

myApp/public/images/kitten.png

您可以从模板访问它,例如:

<img src="/images/kitten.png">

不需要任何路线来完成这项工作。

谨防忽略前导斜线。

<img src="images/kitten.png">

上面的示例将适用于您的顶级路线,例如 /books,这很容易错过,但在 /books/pages 上失败。

于 2014-01-24T19:57:51.657 回答
5

您可能只需要确保路由位于客户端和服务器上都可见的公共区域(此路由实际上在服务器上运行)并指定where: 'server'. 此外,我们需要从磁盘加载实际文件,这意味着我们需要服务器上文件的实际路径,并且我们需要加载“fs”。

var fs = Npm.require('fs');

Router.map(function() {
  this.route('files', {
    path: '/files/:path(*)',
    where: 'server',
    action: function() {
        var path = this.params.path;
        var basedir = '~/app/';

        console.log('will serve static content @ '+ path);

        var file = fs.readFileSync(basedir + path);

      var headers = {
        'Content-type': 'image/png',
        'Content-Disposition': "attachment; filename=" + path
      };

      this.response.writeHead(200, headers);
      return this.response.end(file);
    }
  });
});

几点注意事项:您可能应该将实际下载代码移动到仅服务器函数中并调用它,将响应传递给函数。

您还应该对路径进行一些验证,以免任何人在您的服务器上随意下载文件。

此外,这是显式设置内容类型,您可能希望对图像执行此操作,但可能不适用于其他内容类型。对于泛型类型,您可以将其设置为application/octet-stream

当然,如前所述,如果您的唯一目标是在部署时提供一些静态内容,您应该只使用该/public目录。

于 2014-07-17T22:10:48.443 回答
4

这是iron-router 中的一个错误,他们说它已修复,但我仍然遇到这个问题,其他人已经报告了那个 github 问题,它仍然是一个问题。

编辑:它似乎适用于直接在 /public 中的文件,但不适用于 /public 文件夹中的文件。

于 2015-04-16T23:24:07.107 回答