Подтвердить что ты не робот

Как обслуживать статический контент (изображения, шрифты и т.д.) С помощью железного маршрутизатора

Я только начал работать с железным маршрутизатором на метеоре. Мне нужно показать изображение на главной странице. Мне удалось настроить маршрут для "дома", используя маршрутизацию на стороне клиента. Для статических файлов я пытался использовать 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 не определено никакого маршрута. Я делаю что-то неправильно? Есть ли другой способ обслуживать статические файлы с помощью железного маршрутизатора?

4b9b3361

Ответ 1

Вместо этого вы можете просто поместить файлы в каталог public. Если вы добавите файл:

myApp/public/images/kitten.png

Вы можете получить к нему доступ из ваших шаблонов, например:

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

Для выполнения этой работы не требуются маршруты.

Остерегайтесь игнорировать свинцовую косую черту.

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

приведенный выше пример будет работать с ваших маршрутов верхнего уровня, таких как/книги, что позволяет легко пропустить, но не работает/книги/страницы.

Ответ 2

Вероятно, вам просто нужно убедиться, что маршрут находится в общей области, видимой как на клиенте, так и на сервере (этот маршрут фактически выполняется на сервере) и укажите 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.

Ответ 3

Это ошибка в железе-маршрутизаторе, который, по их словам, исправлен, но я все еще сталкиваюсь с проблемой, а другие сообщают о что github указывает, что это все еще проблема.

Изменить: он работает для файлов, которые находятся непосредственно в /public, но не для файлов в папках внутри/public.