我正在控制器中编写一个动作,从webapp目录下载pdf。当我使用run-app命令运行应用程序时,它完全正常。但是当我创建一个战争时,它会抛出在浏览器上找不到File的错误。我的代码如下。
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
}
请让我知道问题和解决方案的根本原因。
提前致谢。
答案 0 :(得分:2)
你可以尝试这种语法,它可以很适合你。
def pdfFile = new File(ServletContextHolder.servletContext.getRealPath('sales/resources/pdf/'+pdfFileName))
享受。
答案 1 :(得分: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
}
}