2009-10-31 3 views
4

다음 작업은 Grails 뷰 레이어를 완전히 우회하는 클라이언트에 직접 bytes의 바이너리 컨텐트를 쓰는 것을 의미합니다 :Grails 뷰 레이어를 거치지 않고 바이너리 컨텐트를 클라이언트에 직접 작성하기

def actionName = { 
    byte[] bytes = ... 
    ServletOutputStream out = response.getOutputStream() 
    out.write(bytes) 
    out.flush() 
    out.close() 
    return false 
} 

return false는 Grails가 뷰 레이어를 완전히 건너 뛸 것이라고 생각합니다. 그러나, 위의 코드는 여전히 Grails가 /WEB-INF/grails-app/views/controllerName/actionName.jsp을 검색하게하므로 (이 파일이 없기 때문에 404와 함께 실패합니다) 그런 경우는 아닙니다.

질문 :

  • 위의 코드를 통해 Grails에서 뷰 레이어를 완전히 무시할 수 있습니까?

답변

2

이 나타납니다. 이것은 알려진 버그 인 것 같습니다. GRAILS-1223을 참조하십시오.

  1. 사용 render(contentType: "text/html", text: htmlString)GRAILS-1223에서 제안 :

    다음은이 작업 방법입니다. 그러면보기 레이어를 건너 뜁니다.

  2. 콘텐츠 유형을 response.contentType = ''으로 지 웁니다. 또한보기 레이어를 건너 뜁니다. 그러나 일부 브라우저를 혼동시킬 수있는 Content-Type이 없으면 컨텐트가 최종 사용자에게 제공됩니다.
7

null을 반환하거나 null을 반환해야합니다.이 값은 null로 해석됩니다. 여기에 동적으로 생성 된 PDF를 전송 작업에서 일부 작업 코드는 다음과 같습니다 Grails는이 response.contentType.startsWith('text/html') 경우 뷰를 렌더링하는 시도로

def pdf = { 
    byte[] content = ... 
    String filename = ... 
    response.contentType = 'application/octet-stream' 
    response.setHeader 'Content-disposition', "attachment; filename=\"$filename\"" 
    response.outputStream << content 
    response.outputStream.flush() 
} 
+0

안녕 버트! 대답과 좋은 코드 주셔서 감사합니다. 그러나 코드는 "뷰 레이어를 완전히 우회"하지 않습니다. 내 대답은 아래를 참조하십시오. response.contentType == null이 작동하려면 왜 필요합니까? 버그 또는 기능입니까? – knorv

+1

@Burt Beckwith는 항상 response.outputStream.flush()이거나 response.outputStream.close()도 추가해야합니까? 마지막에 null이 반환되는 것은 무엇입니까? – confile

+0

@Burt Beckwith이 질문에 대한 아이디어가 있으십니까? http://stackoverflow.com/questions/18658021/image-byte-to-response-outputstream-in-grails-leads-to-cannot-forward-after – confile

관련 문제