Маршрут к статическому файлу в Play! 2,0
Я пытаюсь сделать маршрут к определенному статическому файлу, но все, что я пытаюсь, заканчивается ошибкой.
Я сделал три разных попытки:
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.
Что мне здесь не хватает?
Спасибо.
Ответы
Ответ 1
IIRC, измените
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
Для
<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
Ответ 2
Я не совсем уверен, что это правильно, но это то, что мы используем для сопоставления общей папки, содержащей наши изображения, javascripts... и т.д.
# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.at(path="/public", file)
Ответ 3
Эта способность все еще не добавлена, как я знаю. Но если кому-то нужен ответ, в качестве опции для этой цели может быть создан вспомогательный контроллер:
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
}
}
а затем в маршрутах config
GET / controllers.StaticFile.html(file = "public/index.html")
Ответ 4
Самое лучшее решение для этого - создать собственный 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
и т.д.
Ответ 5
Ваша третья попытка была почти права.
Вместо
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")
Это решение работает для меня. Надеюсь, это сработает и для вас, и для других.
Ответ 6
У меня такая же проблема. Я последовал совету @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))
Я знаю, что это не ответ, но, возможно, это позволит кому-то подключиться к одному.
Ответ 7
У меня возникла такая же проблема, когда я пытался настроить некоторые дополнительные css. Он работал с этим синтаксисом в файле маршрутов
GET /css/*file controllers.Assets.at(path="/public/css", file)
Ответ 8
Я столкнулся с той же проблемой. Когда я добавил второй 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")"
К сожалению, если вы вернетесь к наличию только одной линии активов в маршрутах, вам придется перейти на однопараметрическую форму, чтобы избежать ошибки компиляции. Кажется, это ошибка.
Ответ 9
Загрузите общую папку 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();
}
}
}