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.AbortWithHttpErrorCodeExceptio
n;
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");
+ }
+ });
}
}
};