Запись двоичного содержимого непосредственно клиенту в обход слоя представления Grails - PullRequest
4 голосов
/ 01 ноября 2009

Следующее действие предназначено для записи двоичного содержимого 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 ]

7 голосов
/ 01 ноября 2009

Вы должны вернуть ноль или вообще ничего, что интерпретируется как ноль. Вот некоторый рабочий код из действия, которое отправляет динамически сгенерированный PDF:

def pdf = {
   byte[] content = ...
   String filename = ...
   response.contentType = 'application/octet-stream'
   response.setHeader 'Content-disposition', "attachment; filename=\"$filename\""
   response.outputStream << content
   response.outputStream.flush()
}
2 голосов
/ 02 ноября 2009

Появляется, когда Grails пытается отобразить представление, если response.contentType.startsWith('text/html'). Кажется, это известная ошибка, см. GRAILS-1223 .

Вот два обходных пути:

  1. Используйте render(contentType: "text/html", text: htmlString), как предложено в GRAILS-1223 . Это обойдет слой представления.
  2. Очистить тип содержимого с помощью response.contentType = ''. Это также обойдет слой просмотра. Тем не менее, обратите внимание, что контент будет предоставляться конечному пользователю без Content-Type, что может запутать некоторые браузеры.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...