32 votes

Route vers un fichier statique dans Play! 2.0

Je suis en train de faire un itinéraire à un fichier statique, mais tout ce que je suis en train se termine avec une erreur.

J'ai fait 3 essais différents:

1.

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

L'erreur que je reçois:

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

2.

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

L'erreur que je reçois:

Compilation error
Identifier expected

3.

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

L'erreur que j'obtient: (et c'est le plus bizarre)

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

Ce qui est curieux au sujet de la 3ème erreur, c'est qu'il est jeté dans un fichier différent (app/views/main.scala.html) sur la ligne suivante:

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

Toutes ces méthodes ont été trouvés dans la documentation officielle et/ou de discussions ici sur stackoverflow. Ce qui me manque ici?

Merci.

18voto

Jamil Points 1437

IIRC, changement

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

À

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

Je parle de ta troisième tentative

Attention aussi aux extra /

ÉDITER

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

En supposant que votre ressource se trouve sur /public/stylesheets/main.css

13voto

Nick Points 192

Je ne suis pas totalement sûr que ce soit correct, mais c'est ce que nous utilisons pour mapper un dossier public contenant nos images, javascripts ... etc.

 # Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.at(path="/public", file)
 

13voto

Andrey Antonov Points 81

Comme je le sais, cette capacité n'a toujours pas été ajoutée. Mais si quelqu'un a besoin d'une réponse, en option, un contrôleur d'assistance peut être créé à ces fins:

 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
  }

}
 

puis dans la configuration des routes

 GET     /               controllers.StaticFile.html(file = "public/index.html")
 

10voto

Michael Allen Points 2475

La solution à ce qui est le plus propre est de créer votre propre AssetsBuilder qui permettront de construire votre page statique.

Créer ce fichier dans votre contrôleurs de package - Statique.scala

package controllers

object Static extends AssetsBuilder

Ensuite, dans votre parcours, vous pouvez définir votre point de terminaison statique

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

Fait. Maintenant le fichier /public/html/file.html sera servi hors d' localhost:9000/file

Si vous remplacez le code ci-dessus avec un plus générique:

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

ensuite, /foo servira /public/html/foo.html, /bar servira /public/html/bar.html etc.

5voto

user2737506 Points 21

Votre troisième tentative était presque droit. Au lieu de

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

de faire comme ceci

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

J'ai eu le même problème avant. Mon itinéraire fichier ressemble à ceci.

# 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)

Et j'ai en dessous de route inverse à l'intérieur de vues (examples.scala.html)

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

Quand j'ai ouvert http://localhost:9000/exmpl, cette erreur a montré jusqu'à.

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

Pour résoudre ce problème, je viens de modifier cet itinéraire

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

pour ce

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

Cette solution a fonctionne pour moi. J'espère que cela fonctionne pour vous et pour les autres aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X