DELIVER FILES VIA SERVLETS Downloading a file through a link on a Web page is easy to implement, but developers are often delivering dynamically created data, or need to force users to agree to license terms and/or log in. In those cases, you need something a little smarter than a hyperlink to manage the delivery of your content--something like a servlet. In order for a servlet to deliver an arbitrary binary file to a Web client, you have to follow a few steps in your servlet's doGet() or doPost() implementation. First, set the content type for the data you'll be sending to the user. Content types (properly called MIME types) are two words separated by a slash that will tell the browser what kind of data it will be receiving. For example, PDF documents use a content type of "application/pdf." Set the content type through the ServletResponse object (declared here as "response"): response.setContentType("application/pdf"); Next, set the disposition information. This tells the browser how to handle the data and sets a filename for the data: response.setHeader("Content-Disposition","inline; filename=\"aDocument.pdf\""); The "inline" portion of the header tells the browser client that it should try to display the data within the browser window, if possible. You can replace "inline" with "attachment" if you would prefer that the data be saved to disk or opened by an external program. You can also optionally set the content length. This isn't required, but it helps increase the reliability of the data transfer: response.setContentLength(/* insert int value here with length of data in bytes */); Finally, to actually send the data to the client, you'll need to get a reference to the OutputStream of the ServletResponse object and write your data to it: ServletOutputStream outStream = response.getOutputStream(); out.write(/* use the appropriate OutputStream.write methods to send your data bytes to the client */); out.close(); You can use this method to provide any sort of data to a client, whether it's a spreadsheet file or an image. It's a simple technique that should be in every servlet developer's bag of tricks. ------------------------------------------