You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2018/01/26 22:52:56 UTC
[4/6] wicket git commit: WICKET-6517 dep could be multipart too
WICKET-6517 dep could be multipart too
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/44fb3748
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/44fb3748
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/44fb3748
Branch: refs/heads/master
Commit: 44fb374876210fc0545a5c02a83232ebc1500a38
Parents: f642f4a
Author: Sven Meier <sv...@apache.org>
Authored: Wed Jan 17 00:32:29 2018 +0100
Committer: Sven Meier <sv...@apache.org>
Committed: Fri Jan 26 23:09:37 2018 +0100
----------------------------------------------------------------------
.../wicket/ajax/res/js/wicket-ajax-jquery.js | 49 ++----
.../examples/ajax/builtin/FileUploadPage.html | 10 +-
.../examples/ajax/builtin/FileUploadPage.java | 26 ++++
.../markup/html/AjaxFileUploadBehavior.java | 156 +++++++++++++++++++
.../extensions/ajax/markup/html/datatransfer.js | 54 +++++++
5 files changed, 261 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/wicket/blob/44fb3748/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
index 801a47d..b2ad3a0 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
@@ -49,8 +49,7 @@
};
}
- var createIFrame,
- getAjaxBaseUrl,
+ var getAjaxBaseUrl,
isUndef,
replaceAll,
htmlToDomDocument,
@@ -66,19 +65,6 @@
};
/**
- * Creates an iframe that can be used to load data asynchronously or as a
- * target for Ajax form submit.
- *
- * @param iframeName {String} the value of the iframe's name attribute
- */
- createIFrame = function (iframeName) {
- // WICKET-6340 properly close tag for XHTML markup
- var $iframe = jQuery('<iframe name="'+iframeName+'" id="'+iframeName+
- '" src="about:blank" style="position: absolute; top: -9999px; left: -9999px;"></iframe>');
- return $iframe[0];
- };
-
- /**
* A safe getter for Wicket's Ajax base URL.
* If the value is not defined or is empty string then
* return '.' (current folder) as base URL.
@@ -553,7 +539,7 @@
extraParam = this._asParamArray(extraParam);
params = params.concat(extraParam);
}
- return jQuery.param(params);
+ return params;
},
/**
@@ -583,6 +569,8 @@
'Wicket-Ajax': 'true',
'Wicket-Ajax-BaseURL': getAjaxBaseUrl()
},
+
+ url = attrs.u,
// the request (extra) parameters
data = this._asParamArray(attrs.ep),
@@ -658,6 +646,17 @@
var el = Wicket.$(attrs.c);
data = data.concat(Wicket.Form.serializeElement(el, attrs.sr));
}
+
+ // collect the dynamic extra parameters
+ if (jQuery.isArray(attrs.dep)) {
+ var dynamicData = this._calculateDynamicParameters(attrs);
+ if (attrs.m.toLowerCase() === 'post') {
+ data = data.concat(dynamicData);
+ } else {
+ var separator = url.indexOf('?') > -1 ? '&' : '?';
+ url = url + separator + jQuery.param(dynamicData);
+ }
+ }
var wwwFormUrlEncoded = undefined; // default
if (attrs.mp) {
@@ -676,29 +675,13 @@
// execute the request
var jqXHR = jQuery.ajax({
- url: attrs.u,
+ url: url,
type: attrs.m,
context: self,
processData: wwwFormUrlEncoded,
contentType: wwwFormUrlEncoded,
beforeSend: function (jqXHR, settings) {
- // collect the dynamic extra parameters
- if (jQuery.isArray(attrs.dep)) {
- var queryString,
- separator;
-
- queryString = this._calculateDynamicParameters(attrs);
- if (settings.type.toLowerCase() === 'post') {
- separator = settings.data.length > 0 ? '&' : '';
- settings.data = settings.data + separator + queryString;
- jqXHR.setRequestHeader("Content-Type", settings.contentType);
- } else {
- separator = settings.url.indexOf('?') > -1 ? '&' : '?';
- settings.url = settings.url + separator + queryString;
- }
- }
-
self._executeHandlers(attrs.bsh, attrs, jqXHR, settings);
we.publish(topic.AJAX_CALL_BEFORE_SEND, attrs, jqXHR, settings);
http://git-wip-us.apache.org/repos/asf/wicket/blob/44fb3748/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.html
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.html
index 9351d4c..4642ae3 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.html
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.html
@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
+<html>
+<body>
<wicket:extend xmlns:wicket="http://wicket.apache.org">
Demonstrates Wicket's ability to transparently handle multipart forms via AJAX.<br/><br/>The only difference between this example and other non-AJAX upload examples is the option to trigger the form submit via an AjaxButton, everything else is handled transparently by Wicket.<br/><br/>
@@ -13,4 +15,10 @@ Demonstrates Wicket's ability to transparently handle multipart forms via AJAX.<
<input type="submit" value="Regular Submit"/> <input wicket:id="ajaxSubmit" type="button" value="Ajax Submit"/>
</form>
-</wicket:extend>
\ No newline at end of file
+<div wicket:id="drop" style="border: 1px dotted black; width:200px; height:200px;">
+ Drop file here.
+</div>
+
+</wicket:extend>
+</body>
+</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/wicket/blob/44fb3748/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.java
index e2eda2e..ca6dc70 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.java
@@ -16,10 +16,14 @@
*/
package org.apache.wicket.examples.ajax.builtin;
+import java.util.List;
+
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.extensions.ajax.markup.html.AjaxFileUploadBehavior;
import org.apache.wicket.extensions.ajax.markup.html.form.upload.UploadProgressBar;
+import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
@@ -110,5 +114,27 @@ public class FileUploadPage extends BasePage
}
});
+
+ WebMarkupContainer drop = new WebMarkupContainer("drop");
+ drop.add(new AjaxFileUploadBehavior() {
+ protected void onFileUpload(AjaxRequestTarget target, List<FileUpload> files) {
+
+ // display uploaded info
+ if (files == null || files.isEmpty())
+ {
+ info("No file uploaded");
+ }
+ else
+ {
+ for (FileUpload file : files) {
+ info("File-Name: " + file.getClientFileName() + " File-Size: " +
+ Bytes.bytes(file.getSize()).toString());
+ }
+ }
+
+ target.add(feedback);
+ }
+ });
+ add(drop);
}
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/44fb3748/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxFileUploadBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxFileUploadBehavior.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxFileUploadBehavior.java
new file mode 100644
index 0000000..3801c62
--- /dev/null
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxFileUploadBehavior.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.extensions.ajax.markup.html;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
+import org.apache.wicket.ajax.attributes.AjaxRequestAttributes.Method;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
+import org.apache.wicket.markup.html.form.upload.FileUpload;
+import org.apache.wicket.protocol.http.servlet.MultipartServletWebRequest;
+import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
+import org.apache.wicket.request.resource.PackageResourceReference;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.lang.Bytes;
+
+/**
+ * Uploads files from a drop event.
+ *
+ * @author svenmeier
+ */
+public class AjaxFileUploadBehavior extends AjaxEventBehavior
+{
+
+ private static final ResourceReference JS = new PackageResourceReference(AjaxFileUploadBehavior.class, "datatransfer.js");
+
+ /**
+ * Maximum size of all uploaded files in bytes in a request.
+ */
+ private Bytes maxSize;
+
+ /**
+ * Maximum size of file of upload in bytes (if there are more than one) in a request.
+ */
+ private Bytes fileMaxSize;
+
+ private String parameterName = "f";
+
+ public AjaxFileUploadBehavior()
+ {
+ super("drop");
+ }
+
+ @Override
+ public void renderHead(Component component, IHeaderResponse response)
+ {
+ super.renderHead(component, response);
+
+ response.render(JavaScriptHeaderItem.forReference(JS));
+
+ // default must be prevented for dragover event, otherwise browser will consume the dataTransfer
+ response.render(OnDomReadyHeaderItem.forScript(String.format("jQuery('#%s').on('dragover', function(e) { e.preventDefault(); });", component.getMarkupId())));
+ }
+
+ @Override
+ protected void updateAjaxAttributes(AjaxRequestAttributes attributes)
+ {
+ super.updateAjaxAttributes(attributes);
+
+ attributes.setMultipart(true);
+ attributes.setMethod(Method.POST);
+ // default must be prevented, otherwise browser will consume the dataTransfer
+ attributes.setPreventDefault(true);
+
+ attributes.getDynamicExtraParameters().add(
+ String.format("return Wicket.DataTransfer.getFilesAsParamArray(attrs.event.originalEvent, '%s');", parameterName)
+ );
+ }
+
+ @Override
+ protected void onEvent(AjaxRequestTarget target)
+ {
+ try
+ {
+ ServletWebRequest request = (ServletWebRequest)getComponent().getRequest();
+ final MultipartServletWebRequest multipartWebRequest = request.newMultipartWebRequest(
+ getMaxSize(), getComponent().getPage().getId());
+ multipartWebRequest.setFileMaxSize(getFileMaxSize());
+ multipartWebRequest.parseFileParts();
+
+ // TODO: Can't this be detected from header?
+ getComponent().getRequestCycle().setRequest(multipartWebRequest);
+
+ ArrayList<FileUpload> fileUploads = new ArrayList<>();
+
+ // Get the item for the path
+ final List<FileItem> fileItems = multipartWebRequest.getFile(parameterName);
+
+ if (fileItems != null)
+ {
+ for (FileItem item : fileItems)
+ {
+ fileUploads.add(new FileUpload(item));
+ }
+ }
+
+ onFileUpload(target, fileUploads);
+ }
+ catch (final FileUploadException fux)
+ {
+ onError(fux);
+ }
+ }
+
+ public Bytes getMaxSize()
+ {
+ return maxSize;
+ }
+
+ public void setMaxSize(Bytes maxSize)
+ {
+ Args.notNull(maxSize, "maxSize");
+ this.maxSize = maxSize;
+ }
+
+ public Bytes getFileMaxSize()
+ {
+ return fileMaxSize;
+ }
+
+ public void setFileMaxSize(Bytes fileMaxSize)
+ {
+ this.fileMaxSize = fileMaxSize;
+ }
+
+ protected void onFileUpload(AjaxRequestTarget target, List<FileUpload> files)
+ {
+ }
+
+ protected void onError(FileUploadException fux)
+ {
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/wicket/blob/44fb3748/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/datatransfer.js
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/datatransfer.js b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/datatransfer.js
new file mode 100644
index 0000000..05ff68a
--- /dev/null
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/datatransfer.js
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+;(function (undefined) {
+ 'use strict';
+
+ if (typeof(Wicket) === "undefined") {
+ window.Wicket = {};
+ }
+
+ if (Wicket.DataTransfer) {
+ return;
+ }
+
+ Wicket.DataTransfer = {
+ getFilesAsParamArray : function(ev, name) {
+ var files = [];
+
+ function pushFile(file) {
+ files.push({'name' : name, 'value' : file});
+ };
+
+ var dataTransfer = ev.dataTransfer;
+ var i;
+ if (dataTransfer.items) {
+ for (i = 0; i < dataTransfer.items.length; i++) {
+ if (dataTransfer.items[i].kind == 'file') {
+ pushFile(dataTransfer.items[i].getAsFile());
+ }
+ }
+ } else {
+ for (i = 0; i < dataTransfer.files.length; i++) {
+ pushFile(dataTransfer.files[i]);
+ }
+ }
+
+ return files;
+ }
+ };
+})();