WICKET-6286 added Location.Blob

downloads via Blob and createObjectURL

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/10175f1e
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/10175f1e
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/10175f1e

Branch: refs/heads/master
Commit: 10175f1ef969ae0feccafc9bf997c78e42c8cc54
Parents: e7c2320
Author: Sven Meier <svenme...@apache.org>
Authored: Thu Mar 23 15:22:15 2017 +0100
Committer: Sven Meier <svenme...@apache.org>
Committed: Thu Mar 23 15:22:15 2017 +0100

----------------------------------------------------------------------
 .../examples/ajax/builtin/AjaxDownloadPage.html |  3 +-
 .../examples/ajax/builtin/AjaxDownloadPage.java | 48 ++++++++++++++++++-
 .../wicket/extensions/ajax/AjaxDownload.java    |  9 +++-
 .../extensions/ajax/wicket-ajaxdownload.js      | 49 ++++++++++++++++++--
 4 files changed, 101 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/10175f1e/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.html
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.html
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.html
index 0be7fe2..dd7e3ab 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.html
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.html
@@ -27,7 +27,8 @@
 </p>
 
 <ul>
-       <li>via an <a wicket:id="download">iframe</a>.</li>
+       <li>for <a wicket:id="download">modern browsers</a>.</li>
+       <li>in an <a wicket:id="downloadIframe">iframe</a>.</li>
        <li>in a <a wicket:id="downloadInNewWindow">new browser window</a>.</li>
        <li>in the <a wicket:id="downloadInSameWindow">same window</a>.</li>
 </ul>

http://git-wip-us.apache.org/repos/asf/wicket/blob/10175f1e/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
index b589091..6d1aa3e 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
@@ -21,6 +21,7 @@ import java.util.concurrent.TimeUnit;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.extensions.ajax.AjaxDownload;
+import org.apache.wicket.extensions.ajax.AjaxDownload.Location;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException;
 import org.apache.wicket.request.resource.ContentDisposition;
@@ -51,6 +52,8 @@ public class AjaxDownloadPage extends BasePage
                add(downloadingContainer);
                
                initDownload();
+               
+               initDownloadInIframe();
 
                initDownloadInNewWindow();
 
@@ -67,7 +70,7 @@ public class AjaxDownloadPage extends BasePage
                // download cannot continue on page refresh
                downloadingContainer.setVisible(false);
        }
-       
+
        private void initDownload()
        {
                IResource resource = new ExampleResource("downloaded via ajax")
@@ -109,6 +112,49 @@ public class AjaxDownloadPage extends BasePage
                        }
                });
        }
+
+       private void initDownloadInIframe()
+       {
+               IResource resource = new ExampleResource("downloaded via ajax 
in iframe")
+                       .setContentDisposition(ContentDisposition.ATTACHMENT);
+               
+               final AjaxDownload download = new AjaxDownload(resource) {
+                       
+                       @Override
+                       protected void onBeforeDownload(AjaxRequestTarget 
target)
+                       {
+                               downloadingContainer.setVisible(true);
+                               target.add(downloadingContainer);
+                       }
+
+                       @Override
+                       protected void onDownloadSuccess(AjaxRequestTarget 
target)
+                       {
+                               downloadingContainer.setVisible(false);
+                               target.add(downloadingContainer);
+                       }
+                       
+                       @Override
+                       protected void onDownloadFailed(AjaxRequestTarget 
target)
+                       {
+                               downloadingContainer.setVisible(false);
+                               target.add(downloadingContainer);
+                               
+                               target.appendJavaScript("alert('Download 
failed');");
+                       }
+               };
+               download.setLocation(Location.IFrame);
+               add(download);
+               
+               add(new AjaxLink<Void>("downloadIframe")
+               {
+                       @Override
+                       public void onClick(AjaxRequestTarget target)
+                       {
+                               download.initiate(target);
+                       }
+               });
+       }
        
        private void initDownloadReference()
        {

http://git-wip-us.apache.org/repos/asf/wicket/blob/10175f1e/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
index 804a794..e50cf9d 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
@@ -73,6 +73,13 @@ public class AjaxDownload extends AbstractDefaultAjaxBehavior
 
        public enum Location {
                /**
+                * The resource will be downloaded into a blob.
+                * <p>
+                * This is recommended for modern browsers.
+                */
+               Blob,
+
+               /**
                 * The resource will be downloaded via a temporary created 
iframe, the resource has to be a
                 * {@link ContentDisposition#ATTACHMENT}.
                 * <p>
@@ -115,7 +122,7 @@ public class AjaxDownload extends 
AbstractDefaultAjaxBehavior
 
        private PageParameters resourceParameters;
 
-       private Location location = Location.IFrame;
+       private Location location = Location.Blob;
 
        /**
         * Download of a {@link Resource}.

http://git-wip-us.apache.org/repos/asf/wicket/blob/10175f1e/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
index ec81ca4..7c320c3 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
@@ -29,10 +29,10 @@
                initiate : function(settings) {
 
                        var notifyServer = function(result) {
-                settings.attributes.ep = settings.attributes.ep || {};
-                settings.attributes.ep.result = result;
-                Wicket.Ajax.ajax(settings.attributes);
-            };
+                               settings.attributes.ep = settings.attributes.ep 
|| {};
+                               settings.attributes.ep.result = result;
+                               Wicket.Ajax.ajax(settings.attributes);
+                       };
 
                        var checkComplete = function(watcher) {
                                var result;
@@ -82,7 +82,7 @@
                                                }
                                        }
                                });
-                       } else {
+                       } else if (settings.method == 'iframe') {
                                var frame = 
jQuery("<iframe></iframe>").hide().prop("src", 
settings.downloadUrl).appendTo("body");
                                checkComplete({
                                        html: function() {
@@ -96,6 +96,45 @@
                                                }, 0);
                                        }
                                });
+                       } else {
+                               jQuery.ajax({
+                                       type: 'get',
+                                       url: settings.downloadUrl,
+                                       success: function (response, status, 
xhr) {
+                                               var filename = "";
+                                               var disposition = 
xhr.getResponseHeader("Content-Disposition");
+                                               if (disposition && 
disposition.indexOf("attachment") !== -1) {
+                                                       var matches = 
/filename[^;=\n]*=(([""]).*?\2|[^;\n]*)/.exec(disposition);
+                                                       if (matches != null && 
matches[1]) {
+                                                               filename = 
matches[1].replace(/[""]/g, "");
+                                                       }
+                                               }
+
+                                               var type = 
xhr.getResponseHeader("Content-Type");
+                                               var blob = new Blob([response], 
{type: type});
+
+                                               var blobUrl = (window.URL || 
window.webkitURL).createObjectURL(blob);
+
+                                               var anchor = jQuery("<a></a>")
+                                                       .prop("href", blobUrl)
+                                                       .prop("download", 
filename)
+                                                       .appendTo("body")
+                                                       .hide();
+                                               
+                                               anchor[0].click();
+                                               
+                                               setTimeout(function () {
+                                                       
URL.revokeObjectURL(blobUrl);
+                                                       anchor.remove();
+                                               }, 100);
+
+                                               notifyServer("success");
+                                       },
+
+                                       error: function (response, status, xhr) 
{
+                                               notifyServer("failed");
+                                       }
+                               });
                        }
                }
        }; 

Reply via email to