Hello and thank you for reading my post.
My question is about downloading a file using a servlet and handling
possible errors that may take place during the download process.
1) I have a JSP page "download-file.jsp" with a "Download file" button:
======================================================
<form method="post" action="do_download_file">
[...]
<input type="submit" name="download_file" id="download_file"
value="Download file" />
[...]
</form>
======================================================
When this button is hit by a user, the "doPost()" method of the servlet
mapped with the action "do_download_file" is executed.
It includes a call to the method below.
2) Everywhere on the Web one can find that type of code (for the file
downloading):
======================================================
public boolean downloadFile(String s_fileNameAndPath, String s_fileName,
HttpServletResponse httpServletResponse)
throws IOException, SQLException, ClassNotFoundException, ModelException
{
File file = null;
long l_fileLength = -1;
ServletOutputStream servletOutputStream = null;
int n_bufsize = 4096;
DataInputStream dataInputStream = null;
int n_nbBytesRead = -1;
boolean b_anErrorOccurred = false;
byte[] byteBuffer;
file = new File(s_fileNameAndPath);
l_fileLength = file.length();
if(l_fileLength <= 0)
{
b_anErrorOccurred = true;
return b_anErrorOccurred;
}
n_nbBytesRead = 0;
byteBuffer = new byte[n_bufsize];
servletOutputStream = httpServletResponse.getOutputStream();
httpServletResponse.setContentType("text/html");
httpServletResponse.setContentLength((int) l_fileLength);
httpServletResponse.setHeader("Content-Disposition",
"attachment;
filename=\"" + s_fileName + "\"");
dataInputStream = new DataInputStream(new
FileInputStream(file));
while((dataInputStream != null)
&& ((n_nbBytesRead = dataInputStream.read(byteBuffer))
!= -1))
{
servletOutputStream.write(byteBuffer, 0,
n_nbBytesRead);
servletOutputStream.flush();
}
if(true)
{
throw new ModelException("To provoke an error
on purpose.");
}
dataInputStream.close();
servletOutputStream.close();
return b_anErrorOccurred;
}
======================================================
(Apart from the exception being thrown) this code works: it actually
downloads the targeted file.
You may have noticed that in the method above, I deliberately throw an
exception so that I can test error handling.
My problem is that, with this way of doing things, I can't tell the user
that the download operation failed since the "HttpServletResponse" has
already been "consumed" when the method returns...
My question is:
Ideally, after the download, I wish I could go back to the JSP
"download-file.jsp" so that I can tell the user that an error occurred while
downloading the file.
If the download was successful, I also would like to tell the user that
everything went right...
I don't see how I can both download the file and redirect the user towards
the "download-file.jsp" page with an appropriate message.
Do you have an idea how I should proceed?
All the best and sorry for the language approximations like "consumed", etc.
--
View this message in context:
http://tomcat.10.x6.nabble.com/File-download-using-a-servlet-and-error-handling-tp5023017.html
Sent from the Tomcat - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]