How to Download different types of files using Grails 3.
If you want to use server-side file download for different types of files like pdf, txt, docx etc then there are different ways to do it.
We can use ServletOutputStream object for it as below:
If you want to use server-side file download for different types of files like pdf, txt, docx etc then there are different ways to do it.
We can use ServletOutputStream object for it as below:
def download(){
def filePath = "/opt/tomcat/webapps/savedFile/filename.pdf" //I am saving files on tomcat.
def file = new File(filePath)
if (file.exists()){
response.setContentType("application/octet-stream")
response.setHeader("Content-disposition", "filename=${file.getName()}")
response.outputStream << file.bytes
}else {
//handle file not found messages.
}
}
Here, contentType is "application/octet-stream" for all types of file. If you want to specified for specific one set contentType for specific one. response.setContentType("application/pdf")
Or you can do simply like this: def download(){
def filePath = "/opt/tomcat/webapps/savedFile/filename.pdf" //I am saving files on tomcat.
def file = new File(filePath)
if (file.exists()){
response.setContentType("application/octet-stream")
response.setHeader("Content-disposition", "filename=${file.getName()}")
response.outputStream << file.newInputStream()
}else {
//handle file not found messages.
}
}
def download(){
def filePath = "/opt/tomcat/webapps/savedFile/filename.pdf" //I am saving files on tomcat.
def file = new File(filePath)
if (file.exists()){
response.setContentType("application/octet-stream")
response.setHeader("Content-disposition", "filename=${file.getName()}")
def outputStream = response.getOutputStream()
outputStream << file.bytes
outputStream.flush()
outputStream.close()
}else {
//handle file not found messages.
}
}
But in grails 3 latter version while deploying the war file to external tomcat(tomcat 7) server then we might get some class not found issue while downloading files.
Error 500: Internal Server Error
URI
/patient/download
Class
java.lang.ClassNotFoundException
Message
Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/WriteListener
Caused by
javax.servlet.WriteListener
In order to solve this issue, we need to make the controller's action wrap with @GrailsCompileStatic annotation.
import grails.compiler.GrailsCompileStatic
@GrailsCompileStatic
def download(){
def filePath = "/opt/tomcat/webapps/savedFile/filename.pdf" //I am saving files on tomcat.
def file = new File(filePath)
if (file.exists()){
response.setContentType("application/octet-stream")
response.setHeader("Content-disposition", "filename=${file.getName()}")
def outputStream = response.getOutputStream()
outputStream << file.bytes
outputStream.flush()
outputStream.close()
}else {
//handle file not found messages.
}
}