playframework - Play의 정적 파일 경로! 2.0




routes playframework-2.0 static-files (9)

이 말이 맞는지는 확실하지 않지만 이미지, 자바 스크립트 등이 들어있는 공용 폴더를 매핑하는 데 사용됩니다.

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

내가 특정 정적 파일에 대한 경로를 만들려고 노력하고 있지만 내가 시도하고있는 모든 것은 오류로 끝납니다.

나는 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

삼.

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

이 방법들은 모두 에서 공식 문서 및 / 또는 스레드에서 찾을 수 있습니다. 내가 여기서 무엇을 놓치고 있니?

감사.


세 번째 시도가 거의 옳았다. 대신에

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

이 솔루션은 저에게 효과적이었습니다. 나는 그것이 당신과 다른 사람들에게도 효과가 있기를 바랍니다.


jar 파일에서 java 패키지 공용 폴더를 재생하면 서버의 절대 파일 위치로 해석되는 정적 파일을 제공하려는 경우 문제가 될 수 있습니다. 올바른 방법은 컨트롤러를 가지고 정적 파일을 제공하는 것입니다.

예를 들어, "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();
        }
    }   
}

나는 같은 문제에 부딪쳤다. 두 번째 controllers.Assets.at 를 다음과 같은 경로에 추가했을 때

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

@routes.Assets.at 호출이 컴파일에 실패했습니다.

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

유감스럽게도 경로에 자산 라인이 하나만있는 경우 컴파일 오류를 피하기 위해 단일 매개 변수 폼으로 변경해야합니다. 나 한테 버그 같아.


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에 있다고 가정합니다.


다른 CSS를 구성하려고 할 때 같은 문제가 발생했습니다. "routes"파일에서이 구문으로 작업했습니다.

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

이것에 대한 솔루션은 정적 페이지를 구축 할 자신 만의 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 등을 게재합니다.


내가 아는 한이 능력은 아직 추가되지 않았다. 그러나 누군가가 대답을 필요로한다면, 헬퍼 컨트롤러가 이러한 목적으로 만들어 질 수 있습니다 :

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

중첩 된 경로부터 사용자를 포함시켜야합니다. 이렇게 무언가 같이 :

<td><%= link_to "Edit", edit_user_item_path(@user, item) %></td>




playframework routes playframework-2.0 static-files