WICKET-6517 new AjaxFileDropBehavior
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/237147fe Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/237147fe Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/237147fe Branch: refs/heads/WICKET-6498_deferred_javascript_2 Commit: 237147fee94e7fb2c0e91216aee0e4a51b448c30 Parents: 44fb374 Author: Sven Meier <[email protected]> Authored: Wed Jan 17 09:23:27 2018 +0100 Committer: Sven Meier <[email protected]> Committed: Fri Jan 26 23:09:37 2018 +0100 ---------------------------------------------------------------------- .../examples/ajax/builtin/FileUploadPage.java | 4 +- .../ajax/markup/html/AjaxFileDropBehavior.java | 160 +++++++++++++++++++ .../markup/html/AjaxFileUploadBehavior.java | 156 ------------------ 3 files changed, 162 insertions(+), 158 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/237147fe/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 ca6dc70..7399301 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 @@ -21,7 +21,7 @@ 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.AjaxFileDropBehavior; 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; @@ -116,7 +116,7 @@ public class FileUploadPage extends BasePage }); WebMarkupContainer drop = new WebMarkupContainer("drop"); - drop.add(new AjaxFileUploadBehavior() { + drop.add(new AjaxFileDropBehavior() { protected void onFileUpload(AjaxRequestTarget target, List<FileUpload> files) { // display uploaded info http://git-wip-us.apache.org/repos/asf/wicket/blob/237147fe/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxFileDropBehavior.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxFileDropBehavior.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxFileDropBehavior.java new file mode 100644 index 0000000..9073cd3 --- /dev/null +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxFileDropBehavior.java @@ -0,0 +1,160 @@ +/* + * 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 Andrew Kondratev + * @author svenmeier + */ +public class AjaxFileDropBehavior extends AjaxEventBehavior +{ + + private static final ResourceReference JS = new PackageResourceReference(AjaxFileDropBehavior.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 AjaxFileDropBehavior() + { + 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() + { + if (maxSize == null) { + maxSize = getComponent().getApplication().getApplicationSettings().getDefaultMaximumUploadSize(); + } + 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/237147fe/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 deleted file mode 100644 index 3801c62..0000000 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/AjaxFileUploadBehavior.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * 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
