File Grails在部署war时无法找到pdf资源

File Grails在部署war时无法找到pdf资源,file,grails,web-applications,path,File,Grails,Web Applications,Path,我正在controller中编写一个从webapp目录下载pdf的操作。当我使用runapp命令运行应用程序时,它运行得非常好。但当我创建一个war时,它抛出浏览器上找不到文件的错误。我的代码如下 def pdfDownlod ={ def pdfFileName=params.pdfFileName def pdfFile = new File('web-app/sales/resources/pdf/'+pdfFileName) response.set

我正在controller中编写一个从webapp目录下载pdf的操作。当我使用runapp命令运行应用程序时,它运行得非常好。但当我创建一个war时,它抛出浏览器上找不到文件的错误。我的代码如下

 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
  }
def pdfDownlod={
def pdfFileName=params.pdfFileName
def pdfFile=新文件('web-app/sales/resources/pdf/'+pdfFileName)
response.setContentType(“application/pdf”)
setHeader(“内容处置”、“附件;文件名=${pdfFileName}”)

response.outputStream这是因为在部署的war中,web app文件夹不存在。要正确获取dev和prod中的资源,请使用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
  }
}
类MyController{
def grailsResourceLocator
def pdfDownlod={
def pdfFileName=params.pdfFileName
final Resource pdfFile=grailsrourcelocator.findResourceForURI('web-app/sales/resources/pdf/'+pdfFileName)
response.setContentType(“application/pdf”)
setHeader(“内容处置”、“附件;文件名=${pdfFileName}”)

response.outputStream您可以尝试这种语法,它对您来说很好

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

享受。

谢谢你的回答,朋友。你能告诉我为什么我的代码不起作用吗?当我们创建war文件时,web应用程序的所有文件夹都直接放在你的foo文件夹中,其中war文件的名称是foo.war。我的解决方案对你有效吗?谢谢你的快速回复。如果在war中,wep应用程序不存在,那么它从哪里获得所有图像、css和js?