File downloads dont occur in the current windows location bar. This means if a failure or something unexpected happens the user doesnt leave the current page they are on or even have to see an ugly error message. This is critical for a good user experience especially on a highly Ajax application. A classic problem with browser file downloads Error handling. In a general case a file downloads occur after a user clicks an lt a hreflocation link. The href in the instructs the browser to browse to the locationindicated. This is equivalent to setting the window. Java. Script. When the response comes back the HTTP response headers can contain many different things in fact almost anything. Here are some examples Normal, HTML Response. Content Type texthtml charsetutf 8. Content Type texthtml charsetutf 8. The above Content Type indicates to the browser that it should parse the DOM in the response and display it to the user. The location in the users location bar changes to reflect the address of the just downloaded content. Normal, File Download Response. Content Disposition attachment filenameReport. Content Disposition attachment filenameReport. The above Content Disposition indicates to the browser that the server is trying to invoke a file download in the browser. The browser responds by opening up a file download dialog or ribbon for the user to download the file. As a convenience when the browser detects a response like this it doesnt change the address bar so effectively the user stays on the same page. Failed, File Download Response. Content Type texthtml charsetutf 8. Content Type texthtml charsetutf 8. As you may have guessed from that ugly highlighter color weve got trouble here. The response from a file download error is generally no different from a normal HTML response, the only difference here is that is has an error message as HTML content. The browser will now happily replace your existing page and address with the new error message. Not only have we now displayed an ugly error message to the user but we have also caused them to leave whatever page they were on. Imagine you have created a nearly exclusively Ajax site like Gmail. Microsoft Windows 8 Ultimate Activator Boats. A response like this from the server will cause your entire DOM to be replaced by an error message. Imagine this happening to you in Gmail and having to load up everything all over again. Ouch My current role creating the framework for a highly Ajax application like Gmail inspired me to write this plugin for all to use web applications is where the web is going anyways so there has to be a better wayAnother classic problem with browser file downloads Happy path user experience. I probably just caught you thinking this well so what my site never has any problems that cause error messages fair enough, but consider this What is the response time of your web site in terms of serving up static filesIs it instantaneous Is a user going to immediately look in the far corners of their screen for some sort of a spinning indicator or might they get confused or angry based on their technical prowess Maybe they are looking at one of these Animationnetscapeanim. I hope not or youve got bigger issuesWhat if you are serving up a dynamically generated file perhaps a report of SQL data based on user input that may take a few seconds. An average user might expect some sort of indication of what is going on. At the very least from a developers perspective itd be nice if it wasnt easy for them to hammer the download link a few times to make it faster of course wasting cycles across an entire n tiered application. Ive got a solution just use Ajax to download it Good idea Unfortunately this is not possible due to one key problem Java. Script, by design, doesnt have the ability to perform lower level tasks on a users computer out of security concerns. Initiating file download prompts is one of these limitations. You can certainly use an XMLHttp. Request object to download a binary or otherwise file but there is nothing you can do to the response to somehow get it saved on the users computer. Flash doesnt have this limitation, but we really dont want to get into Flash do we Enter j. Query File Downloadj. Query File Download overcomes all of the aforementioned limitations of a normal browser file downloads. Well how the heck does that work The concept is nothing new in fact If you browse around the web you will find plenty of forum posts discussing the same technique, I just wasnt able to find a succinct easy to use plug in to do it hence my decision to create this plugin. The answer is An iframe and cookie. What I have to rely on Web. Web 2. 0 Ajax application user friendly Turns out this is the magic bullet combination to work around normal limitations of file downloads, heres how iframe. An iframe which is generally a mortal sin of modern web development can exist in a DOM but in most respects is treated like an entirely different window. By dynamically inserting a hidden iframe into the DOM and setting its location to the desired file path we can initiate a file download just like it was occurring in the main application window. This directly gets us around one of the nasties of file downloads if an error occurs the user has now been forced off of the page they were on which may contain an Ajax application like Gmail to see an ugly error message. Like a normal file download in the main window an iframe will never fill with content when a successful file download occurs. It simply contains an empty DOM. Well how do we detect what is going on if nothing happens when the file download is successful. Well this is where the cookie comes in cookie iframe. Since the creation of cookies exists in HTTP headers, which is standard fare for all web requests and responses, we can actually write a cookie to indicate that a file download has been initiated properly instead of an error page. The response from the web server will now look something like this. Content Disposition attachment filenameReport. Set Cookie file. Downloadtrue path. Content Disposition attachment filenameReport. Set Cookie file. Downloadtrue pathWhile we cant directly tell if a file download has occurred we can check for the existence of a cookie which is exactly how j. Query File Download works. Once a download is initiated on the iframe a configurable duration poll of cookies and the iframe contents occurs. If the iframe fills with contents then we know a file download has occurred in most cases, make sure to set a MIME type. If the cookie gets written then we know to stop polling and kill the iframe because the file download dialogribbon has been displayed. Using j. Query File Download Java. Scriptj. Query File Download is easy to use in the simple case but also allows for various callback options as well. Dont forget to add the required cookie code in the next section Very simple code demo. Downloadurltodownload. Downloadurltodownload. Use of the very simple approach only protects you from the page changing in the event of a file download error. This alone is pretty useful.
Jsp Download Pdf File Code For Excel© 2017