2011-12-21 4 views
1

내 템플릿에 같은 코드의 비트 :플레이 프레임 워크 및 이미지 캐싱

#{list people, as:'person'} 
    <img src="@@{Application.image(person.id)}"> 
#{/list} 

플레이 서버를 시작한 후 목록의 첫 번째 이미지를 여러 번 보여줍니다. 예를 들어 인물 변수에 1, 2, 3, 4, 5의 ID가 포함 된 경우 5 개의 이미지가 표시되지만 모두 동일한 이미지, 즉 1의 ID에 해당하는 이미지의 변수가 표시됩니다.

새로 고침을 누르면 이미지가 ID에 따라 고유하게 변경됩니다.

<img src="http://url/application/image?personId=1"/> 
<img src="http://url/application/image?personId=2"/> 
<img src="http://url/application/image?personId=3"/> 
<img src="http://url/application/image?personId=4"/> 
<img src="http://url/application/image?personId=5"/> 

가 어떻게 같은 이미지 처음 라운드를 보여주는에서 템플릿을 중지 할 수 있습니다 템플릿에서 렌더링 된 HTML은 다음과 같습니다?

편집 :

... 
response.setHeader("Pragma-directive", "no-cache"); 
response.setHeader("Cache-directive", "no-cache"); 
response.setHeader("Cache-control", "no-cache"); 
response.setHeader("Pragma", "no-cache"); 
response.setHeader("Expires", "0"); 
renderBinary(imageFile); 

로 포스트 this 당 :은 또한 SRC 요청에 응답 내 컨트롤러에서 renderBinary (이미지) 호출하기 전에 아래에 보이는 응답 헤더를 추가했습니다. 실제로 처음 몇 시간 동안 작동했지만 Play 서버를 중지하고 시작한 후 세 번째로는 다른 인물에도 불구하고 모든 이미지가 동일한 이미지를 보여주는 동일한 캐싱 문제가있었습니다. 나는 또한 행운을 남기지 않고 url 끝에 timestamp를 추가했다.

편집 # 2 : 나는 또한 application.conf에서 0으로 http.cacheControl 속성을 변경 시도 :

http.cacheControl=0 

을하지만 그것이 옳고 그름을 보였다 여부는 다시에 관해서는 나에게 일관성없는 결과를 준 이미지. 내가 생각할 수있는

답변

1

이것이 가능한 솔루션인지 확실하지 않지만 다음과 같은 작업을 수행하면 해결할 수있는 작업이 지금 있습니다. (글쎄, 아직 실패하지 않았습니다) :

  • renderBinary (...) 전에 캐시 제어를 설정하십시오.) 당신이 FileInputStream에로 렌더링 된 파일 변환 컨트롤러

    response.setHeader("Cache-Control", "no-cache");

  • 에 호출하고 renderBinary (...) 메소드 대신 직접 파일에 저를 전달합니다. 이처럼

는 :

File fileImage = ... // some .png image 
FileInputStream stream = new FileInputStream(fileImage); 
renderBinary(stream); 

나는 캐싱에 대해이 bug report을보고하고 바이너리를 렌더링에서 아이디어를 얻었다.

1

2 옵션 :

  1. 는 고유 번호를 생성하고 쓸모없는 매개 변수로 이미지의 URL에 추가합니다. 예 : "http : // url/application/image? personId = 1 & ts = 12314125123". 이렇게하면 페이지가 생성 될 때마다 URL이 변경되므로 브라우저는 캐시에 도달하지 않고 매번 이미지를 요청합니다. 일반적으로 타임 스탬프는 매개 변수로 가장 잘 작동합니다.

  2. 이미지가 제공 될 때 "캐시 없음"값으로 "캐시 제어"HTTP 응답 헤더 매개 변수를 설정하는 몇 가지 방법을 찾아보십시오. 사용자 정의 서블릿을 사용하여 이미지를 스트리밍하는 경우 매우 간단해야합니다. 그렇지 않은 경우 어떻게 할 수 있는지 확신 할 수 없지만 Play에서 방법을 제공합니다.

예전에는 거의 항상 쉽게 옵션 1을 사용했습니다. 게토,하지만 작동합니다.

+0

나는 그 일을 생각했지만 personIds가 적어도 처음으로 유일 할 것이라고 생각했는데 왜 타임 스탬프를 추가하면 달라질까요? (나는 그것을 시도하고 문제가 사라진 것 같지만, 사람 ID가 왜 똑같은 영향을 미치지 않았는지, 적어도 처음에는 혼란 스럽다) – digiarnie

+0

수정, 나는 이미지가 반복되는 또 다른 인스턴스를 가졌다. 타임 스탬프가 있음에도 불구하고. – digiarnie

+0

나는 또한 이것을 시도했다 : response.setHeader ("Cache-Control", "no-cache"); renderBinary (이미지)를 호출하기 전에 내 컨트롤러에서; 그리고 그것은 그 문제를 해결하지 못하는 것 같습니다. – digiarnie

관련 문제