[ https://issues.apache.org/jira/browse/WICKET-7033?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17711228#comment-17711228 ]
ASF GitHub Bot commented on WICKET-7033: ---------------------------------------- reiern70 commented on code in PR #571: URL: https://github.com/apache/wicket/pull/571#discussion_r1163719410 ########## wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/resource/AbstractFileUploadResource.java: ########## @@ -0,0 +1,206 @@ +/* + * 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.markup.html.form.upload.resource; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUploadBase; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.wicket.WicketRuntimeException; +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.cycle.RequestCycle; +import org.apache.wicket.request.resource.AbstractResource; +import org.apache.wicket.util.lang.Bytes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.github.openjson.JSONObject; + +/** + * The resource that handles the file uploads. + * Reads the file items from the request parameters and uses {@link IUploadsFileManager} + * to store them. + * Additionally, cares about the response's content type and body. + * <p> + * This code was adapted from + * <p> + * <a href="https://github.com/martin-g/blogs/blob/master/file-upload/src/main/java/com/mycompany/fileupload/AbstractFileUploadResource.java">AbstractFileUploadResource.java</a> + * <p> + * The main difference is that there some JQuery plugin is used at client side (and it supports multiple uploads + + * some UI allowing to delete/preview files and so on). + * Here we are just using plain jQuery code at client side to upload a single file. + */ +public abstract class AbstractFileUploadResource extends AbstractResource +{ + private static final Logger LOG = LoggerFactory.getLogger(AbstractFileUploadResource.class); + + public static final String PARAM_NAME = "FILE-UPLOAD"; + + private final IUploadsFileManager fileManager; + + public AbstractFileUploadResource(IUploadsFileManager fileManager) + { + this.fileManager = fileManager; + } + + /** + * Reads and stores the uploaded files + * + * @param attributes + * Attributes + * @return ResourceResponse + */ + @Override + protected ResourceResponse newResourceResponse(Attributes attributes) + { + final ResourceResponse resourceResponse = new ResourceResponse(); + + final ServletWebRequest webRequest = (ServletWebRequest) attributes.getRequest(); + + String identifier = webRequest.getRequestParameters().getParameterValue("uploadId").toString("resource"); + + try + { + MultipartServletWebRequest multiPartRequest = webRequest.newMultipartWebRequest(getMaxSize(), identifier); + multiPartRequest.parseFileParts(); + + RequestCycle.get().setRequest(multiPartRequest); + + Map<String, List<FileItem>> files = multiPartRequest.getFiles(); + List<FileItem> fileItems = files.get(PARAM_NAME); + + if (fileItems != null) + { + List<FileUpload> fileUploads = new ArrayList<>(); + for (FileItem fileItem : fileItems) + { + fileUploads.add(new FileUpload(fileItem)); + } + saveFiles(fileUploads, identifier); + prepareResponse(resourceResponse, webRequest, fileUploads); + } + else + { + resourceResponse.setContentType("application/json"); + resourceResponse.setWriteCallback(new WriteCallback() + { + @Override + public void writeData(Attributes attributes) throws IOException + { + JSONObject json = new JSONObject(); + json.put("error", true); + json.put("errorMessage", "No files selected!"); + String error = json.toString(); + attributes.getResponse().write(error); + } + }); + } + + } + catch (FileUploadException e) + { + if (e instanceof FileUploadBase.FileSizeLimitExceededException || e instanceof FileUploadBase.SizeLimitExceededException) + { + resourceResponse.setError(413, "File size exceeded!"); + return resourceResponse; + } + throw new WicketRuntimeException(e); + } + catch (Exception fux) + { + LOG.error("An error occurred while uploading a file", fux); + resourceResponse.setContentType("application/json"); + JSONObject json = new JSONObject(); + json.put("error", true); + json.put("errorMessage", fux.getMessage()); Review Comment: Done > add support to uploading to a resource > -------------------------------------- > > Key: WICKET-7033 > URL: https://issues.apache.org/jira/browse/WICKET-7033 > Project: Wicket > Issue Type: New Feature > Components: wicket > Reporter: Ernesto Reinaldo Barreiro > Assignee: Ernesto Reinaldo Barreiro > Priority: Major > Fix For: 10.0.0, 9.14.0 > > > Add support for the following: > * Upload to a resource in an asynchronous non page blocking request > * Add an optional way to block the user from leaving the page while the > upload is happening > * Ways to cancel the upload > * Adapt the upload progress bar to work with this new "component" and improve > its code as in some corner cases it is producing client side errors (I > created an issue for that some time ago). > * Maybe useful too: create a web socket based progress bar, as the upload > progress bar now works pulling the server every second. > * Also to add an example to wicket-examples that uses a smart JS uploader, > like in the blog > (https://github.com/martin-g/blogs/blob/master/file-upload/). This way you > will verify that the new APIs are easily extendable. -- This message was sent by Atlassian Jira (v8.20.10#820010)