Маршрут к статическому файлу в Play! 2.0

Я пытаюсь создать маршрут к определенному статическому файлу, но все, что я пытаюсь сделать, заканчивается ошибкой.

Я сделал 3 разных попытки:

1.

GET /file   staticFile:/public/html/file.html

Ошибка, которую я получаю:

Compilation error
string matching regex `\z' expected but `:' found

2.

GET /file   controllers.Assets.at(path="/public/html", "file.html")

Ошибка, которую я получаю:

Compilation error
Identifier expected

3.

GET /file   controllers.Assets.at(path="/public/html", file="file.html")

Ошибка, которую я получаю: (и это самое странное)

Compilation error
not enough arguments for method at: (path: String, file: String)play.api.mvc.Call. Unspecified value parameter file.

Странная часть третьей ошибки заключается в том, что она возникает в другом файле (app/views/main.scala.html) в следующей строке:

<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">

Все эти методы были найдены в официальной документации и/или тредах здесь, в stackoverflow. Что мне здесь не хватает?

Спасибо.


person Nitzan Tomer    schedule 20.03.2012    source источник
comment
Я думаю, что третья ошибка возникает, когда первый экземпляр общедоступной маршрутизации упоминается в шаблонах по умолчанию. У меня точно такая же проблема. Я ожидаю, что статическая ссылка, которую вы/я пытаетесь добавить, испортит обратную маршрутизацию.   -  person flurdy    schedule 31.03.2012
comment
Какие? два года и нет принятого ответа. Эта проблема еще не решена?   -  person Jus12    schedule 05.10.2014
comment
@ Jus12 Извините, просто я не продолжил использовать игру (не по моему выбору, и это прискорбно), и я не знаю, какой ответ правильный. Тот, кто набрал наибольшее количество голосов, тогда не решил проблему (как объясняется в моем комментарии). Если кто-то сообщит мне, правильный ли какой-либо из ответов, я с радостью отмечу его как принятый.   -  person Nitzan Tomer    schedule 05.10.2014
comment
@NitzanTomer ответ Майкла Аллена сработал для меня.   -  person Jus12    schedule 05.10.2014
comment
@Jus12 Jus12 Поскольку я не уверен, как это сделать, я попросил рекомендации на мета-сайте, похоже, его следует оставить как есть: meta.stackoverflow.com/questions/272882/   -  person Nitzan Tomer    schedule 06.10.2014


Ответы (9)


IIRC, изменение

<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">

To

<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/", "main.css")">

Я говорю о вашей третьей попытке

Кроме того, следите за дополнительным /

ИЗМЕНИТЬ

GET /assets/main.css    controllers.Assets.at(path="/public", file="/stylesheets/main.css")

Предполагая, что ваш ресурс находится в /public/stylesheets/main.css

person Jamil    schedule 21.03.2012
comment
Это просто решает другую ошибку, но проблема не в том, что вы изменили, когда я комментирую эту строку маршрутизации, все работает хорошо (за исключением того, что файл не обслуживается). Ошибка в третьей попытке связана с основным файлом шаблона и именно это я получил от команды play new app-name, я его не менял, и как я писал, он хорошо работает без та маршрутизация. - person Nitzan Tomer; 22.03.2012

Я не совсем уверен, правильно ли это, но это то, что мы используем для сопоставления общей папки, содержащей наши изображения, javascripts... и т.д..

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.at(path="/public", file)
person Nick    schedule 02.08.2012
comment
Спасибо за ответ, у меня пока не было возможности попробовать это, надеюсь, я вернусь к этому и отчитаюсь. - person Nitzan Tomer; 02.08.2012
comment
Если я переименую общую папку в ресурсы, это, похоже, не сработает (используя path="/assets",...). Есть идеи, почему? - person Jon Onstott; 14.10.2014

Насколько я знаю, эту способность до сих пор не добавили. Но если кому-то нужен ответ, как вариант, для этих целей можно создать вспомогательный контроллер:

object StaticFile extends Controller {

  def html(file: String) = Action {
    var f = new File(file)

    if (f.exists())
      Ok(scala.io.Source.fromFile(f.getCanonicalPath()).mkString).as("text/html");
    else
      NotFound
  }

}

а затем в конфигурации маршрутов

GET     /               controllers.StaticFile.html(file = "public/index.html")
person Andrey Antonov    schedule 26.12.2012

Самое чистое решение этой проблемы — создать собственный AssetsBuilder, который создаст вашу статическую страницу.

Создайте этот файл в своем пакете контроллеров — Static.scala.

package controllers

object Static extends AssetsBuilder

Затем в ваших маршрутах вы можете определить свою статическую конечную точку

GET /file   controllers.Static.at(path="/public/html", "file.html")

Сделанный. Теперь файл в /public/html/file.html будет обслуживаться с localhost:9000/file

Если вы замените жесткий код выше более общим:

GET /*file   controllers.Static.at(path="/public/html", *file + ".html")

затем /foo будет обслуживать /public/html/foo.html, /bar будет обслуживать /public/html/bar.html и т. д.

person Michael Allen    schedule 14.08.2013

Твоя третья попытка была почти правильной. Вместо

GET /file   controllers.Assets.at(path="/public/html", file="file.html")

делай это так

GET /file   controllers.Assets.at(path="/public", file="html/file.html")

У меня была такая же проблема раньше. Мой файл маршрута выглядит так.

# Application
GET /       controllers.Assets.at(path="/public/html", file="static.html")
GET /exmpl  controllers.Examples.index

# Resources
GET /assets/*file  controllers.Assets.at(path="/public", file)

И у меня ниже обратный маршрут внутри представлений (examples.scala.html)

@routes.Assets.at("imagefolder")   #try to generate path to /public/imagefolder.

Когда я открываю http://localhost:9000/exmpl, появляется эта ошибка.

not enough arguments for method at: (path: String, file: String)play.api.mvc.Call. Unspecified value parameter file.

Чтобы решить эту проблему, я просто изменил этот маршрут

GET /     controllers.Assets.at(path="/public/html", file="static.html")

к этому

GET /     controllers.Assets.at(path="/public", file="html/static.html")

Это решение работало для меня. Я надеюсь, что это работает для вас и других тоже.

person user2737506    schedule 01.09.2013

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

Измените маршрут (этот маршрут теперь разрешается правильно)

GET     /favicon.ico                controllers.Assets.at(path="/public/images", file="favicon.png")

Изменение представления (компилируется)

<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/","main.css")">

Новая ошибка (только во время выполнения)

[MatchError: (stylesheets/,main.css) (of class scala.Tuple2)]

// @LINE:29
// @LINE:28
def at(path:String, file:String) = {
   (path, file) match {
// @LINE:28
case (path, file) if path == "/public" => Call("GET", "/assets/" + implicitly[PathBindable[String]].unbind("file", file))

Я знаю, что это не ответ, но, возможно, это позволит кому-то ответить.

person Ben Boyter    schedule 01.08.2012
comment
Спасибо за ответ, у меня пока не было возможности попробовать это, надеюсь, я вернусь к этому и отчитаюсь. - person Nitzan Tomer; 02.08.2012
comment
Правильный маршрут: GET /favicon.ico controllers.Assets.at(path=/public, file=images/favicon.ico) - person AlexV; 31.12.2013

У меня возникла та же проблема, когда я пытался настроить некоторые дополнительные css. Он работал с этим синтаксисом в файле «маршруты».

  GET   /css/*file                      controllers.Assets.at(path="/public/css", file)
person loic23    schedule 27.05.2012
comment
то же, что и выше, это работает, но мы не можем понять, почему - person Khoa; 26.03.2017

Я столкнулся с той же проблемой. Когда я добавил второй controllers.Assets.at к таким маршрутам, как

GET  /assets/*file   controllers.Assets.at(path="/public", file)
GET  /assets2/*file  controllers.Assets.at(path="/public2", file)

вызовы по умолчанию @routes.Assets.at в main.scala.html не удалось выполнить компиляцию

Compilation error
not enough arguments for method at: (path: String, file: String)play.api.mvc.Call. Unspecified value parameter file.

По-видимому, это связано с неявным параметром, для которого существует несколько совпадающих объектов. Решение состоит в том, чтобы добавить ведущий позиционный параметр:

href="@routes.Assets.at("/public","/css/main.css")"

К сожалению, если вы вернетесь к использованию только одной строки ресурсов в маршрутах, вам придется перейти на форму с одним параметром, чтобы избежать ошибки компиляции. Мне кажется ошибка.

person Eric Drechsel    schedule 23.05.2013

Воспроизведение общедоступной папки пакетов java в файле jar, и это может быть проблемой, если вы хотите обслуживать статический файл, который разрешается в абсолютное местоположение файла на сервере. Правильный способ — иметь собственный контроллер и использовать его для обслуживания статического файла.

Например, для обслуживания файла "mystatic.html", который находится в

<your playhome>
    |-----<myfolder>
        |------mystatic.html

Вы должны настроить этот маршрут в файле маршрутов.

GET /mystatic           mypackage.mycontrollers.Static.getFile(path="/myfolder/mystatic.html")

и ваш контроллер будет реализован следующим образом.

package mypackage.mycontroller;

import java.io.File;
import com.google.inject.Inject;
import com.google.inject.Provider;

import play.Application;
import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.Results;

public class Static extends Controller {

    @Inject
    Provider<Application> app;

    public Result getFile(String path){
        File file = app.get().getFile(path);
        if(file.exists()){
            return ok(file);            
        }else{
            return Results.notFound();
        }
    }   
}
person Droidman    schedule 09.02.2017