Route vers le fichier statique en jeu! 2,0

j'essaie de faire une route vers un fichier statique spécifique mais tout ce que j'essaie se termine par une erreur.

j'ai fait 3 tentatives différentes:

1.

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

L'erreur que j'obtiens:

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

2.

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

L'erreur que j'obtiens:

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.

la partie bizarre de la 3ème erreur est qu'elle est lancée 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ées dans la documentation officielle et/ou les threads ici sur stackoverflow. Ce qui me manque ici?

Merci.

32
demandé sur flurdy 2012-03-20 22:36:53

9 réponses

IIRC, change

<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 suis en train de parler de votre troisième tentative

attention aussi aux extra/

EDIT

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

en supposant que votre ressource est at/public/stylesheets / main.css

18
répondu Jamil 2012-03-21 22:29:21

Je ne suis pas totalement sûr que ce soit correct, mais c'est ce que nous utilisons pour cartographier 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)
13
répondu Nick 2012-08-02 02:21:02

cette capacité n'a pas encore été ajoutée, comme je le sais. Mais si quelqu'un a besoin de réponse, en option, le contrôleur helper peut être créé dans ce but:

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
  }

}

et puis dans les routes config

GET     /               controllers.StaticFile.html(file = "public/index.html")
13
répondu Andrey Antonov 2012-12-26 14:52:47

la solution la plus propre est de créer votre propre AssetsBuilder qui construira votre page statique.

Créez ce fichier dans votre paquet controllers - Static.scala

package controllers

object Static extends AssetsBuilder

puis dans vos routes vous pouvez définir votre point final 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 dur ci-dessus par un code plus générique:

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

/foo va servir /public/html/foo.html,/bar serviront /public/html/bar.html etc.

10
répondu Michael Allen 2013-08-14 15:36:34

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

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

le faire comme ceci

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

j'ai eu le même problème avant. Mon dossier d'itinéraire ressemble à ça.

# 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'ouvre http://localhost:9000/exmpl, cette erreur s'est manifestée.

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 me convenait. J'espère que ça marchera pour vous et les autres aussi.

5
répondu user2737506 2013-09-01 15:31:34

j'ai exactement le même problème. J'ai suivi les conseils de @Jamil et j'ai réussi à obtenir que cela fonctionne pour le fichier statique (dans mon cas un favicon) et j'ai réussi à obtenir les gabarits pour compiler mais j'ai obtenu une nouvelle erreur à l'exécution en essayant d'utiliser la vue. Code pertinent ci-dessous,

Changement du tracé (cette route maintenant résolu correctement)

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

Modifier la vue (compile)

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

Nouveau message d'erreur (uniquement au moment de l'exécution)

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

je sais que c' n'est pas une réponse, mais peut-être que cela permettra à quelqu'un de conduite avec un.

4
répondu Ben Boyter 2012-08-01 23:13:18

j'éprouvais le même problème pendant que j'essayais de configurer des css supplémentaires. Il a fonctionné avec cette syntaxe dans le fichier" routes"

  GET   /css/*file                      controllers.Assets.at(path="/public/css", file)
3
répondu loic23 2012-05-27 21:41:23

j'ai rencontré le même problème. Quand j'ai ajouté un deuxième controllers.Assets.at pour les routes, comme

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

par défaut @routes.Assets.at appels principaux.Scala.échec de la compilation html

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

cela semble être dû à un paramètre implicite pour lequel il y a plusieurs objets correspondants. La solution est d'ajouter un paramètre de position principal:

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

malheureusement, si vous retournez à n'avoir qu'une seule ligne d'actifs dans les routes, vous devrez passer à la forme à un paramètre pour éviter une erreur de compilation. Semble être un bug pour moi.

1
répondu Eric Drechsel 2013-05-23 23:25:09

lire le dossier public des paquets java dans un fichier jar et ce serait un problème si vous souhaitez servir un fichier statique qui se résout à un emplacement de fichier absolu dans le serveur. La bonne façon de le faire est d'avoir votre propre contrôleur et de l'utiliser pour servir les fichiers statiques.

par exemple, pour servir un fichier " mystatic.html" qui est dans le

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

vous configureriez cette route dans votre fichier de routes.

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

et votre controller serait implémenté comme suivre.

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();
        }
    }   
}
1
répondu Droidman 2017-02-09 14:55:02