2

我正在控制器中编写一个动作以从 webapp 目录下载 pdf。当我使用 run-app 命令运行应用程序时,它工作得非常好。但是当我创建一个战争时,它会抛出在浏览器上找不到文件的错误。我的代码如下。

 def pdfDownlod ={
      def pdfFileName=params.pdfFileName
      def pdfFile = new File('web-app/sales/resources/pdf/'+pdfFileName)
      response.setContentType("application/pdf")
      response.setHeader("Content-disposition", "attachment; filename=${pdfFileName}")
      response.outputStream << pdfFile?.getBytes()
      response.outputStream.flush()
      return
  }

请让我知道问题的根本原因和解决方案。

提前致谢。

4

2 回答 2

2

你可以试试这个语法,它会很好地为你工作。

def pdfFile = new File(ServletContextHolder.servletContext.getRealPath('sales/resources/pdf/'+pdfFileName))

享受。

于 2013-09-19T11:33:36.350 回答
1

那是因为在您部署的战争中,web-app 文件夹不存在。要在 dev 和 prod 中正确获取资源,请使用grailsResourceLocator bean。

例子:

class MyController {

def grailsResourceLocator

  def pdfDownlod ={
      def pdfFileName = params.pdfFileName
      final Resource pdfFile = grailsResourceLocator.findResourceForURI('web-app/sales/resources/pdf/'+pdfFileName)

      response.setContentType("application/pdf")
      response.setHeader("Content-disposition", "attachment; filename=${pdfFileName}")
      response.outputStream << pdfFile?.file.bytes // << already flushes!
      return
  }
}
于 2013-09-19T11:12:24.313 回答