org.nuxeo.ecm.platform.ui.web.util.FileUploadHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.nuxeo.ecm.platform.ui.web.util.FileUploadHelper.java

Source

/*
 * (C) Copyright 2006-2009 Nuxeo SA (http://nuxeo.com/) and others.
 *
 * Licensed 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.
 *
 * Contributors:
 *     Nuxeo - initial API and implementation
 *
 * $Id$
 */

package org.nuxeo.ecm.platform.ui.web.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.jboss.seam.web.MultipartRequest;
import org.nuxeo.ecm.core.api.Blob;
import org.nuxeo.ecm.core.api.Blobs;
import org.restlet.data.Request;

import com.noelios.restlet.ext.servlet.ServletCall;
import com.noelios.restlet.http.HttpCall;
import com.noelios.restlet.http.HttpRequest;

/**
 * Helper to encapsulate Multipart requests parsing to extract blobs.
 * <p>
 * This helper is needed to provide the indirection between - the Apache file upload based solution (5.1) and - the Seam
 * MultiPartFilter bases solution (5.1 / Seam 2.x).
 *
 * @author tiry
 */
public class FileUploadHelper {

    private FileUploadHelper() {
    }

    /**
     * Parses a Multipart Restlet Request to extract blobs.
     */
    public static List<Blob> parseRequest(Request request) throws FileUploadException, IOException {
        if (request instanceof HttpRequest) {
            HttpRequest httpRequest = (HttpRequest) request;
            HttpCall httpCall = httpRequest.getHttpCall();
            if (httpCall instanceof ServletCall) {
                HttpServletRequest httpServletRequest = ((ServletCall) httpCall).getRequest();
                return parseRequest(httpServletRequest);
            }
        }
        return null;
    }

    /**
     * Parses a Multipart Servlet Request to extract blobs
     */
    public static List<Blob> parseRequest(HttpServletRequest request) throws FileUploadException, IOException {
        List<Blob> blobs = new ArrayList<Blob>();

        if (request instanceof MultipartRequest) {
            MultipartRequest seamMPRequest = (MultipartRequest) request;

            Enumeration<String> names = seamMPRequest.getParameterNames();
            while (names.hasMoreElements()) {
                String name = names.nextElement();
                try (InputStream in = seamMPRequest.getFileInputStream(name)) {
                    if (in != null) {
                        Blob blob = Blobs.createBlob(in);
                        blob.setFilename(seamMPRequest.getFileName(name));
                        blobs.add(blob);
                    }
                }
            }
        } else {
            // fallback method for non-seam servlet request
            FileUpload fu = new FileUpload(new DiskFileItemFactory());
            String fileNameCharset = request.getHeader("FileNameCharset");
            if (fileNameCharset != null) {
                fu.setHeaderEncoding(fileNameCharset);
            }
            ServletRequestContext requestContext = new ServletRequestContext(request);
            List<FileItem> fileItems = fu.parseRequest(requestContext);
            for (FileItem item : fileItems) {
                try (InputStream is = item.getInputStream()) {
                    Blob blob = Blobs.createBlob(is);
                    blob.setFilename(item.getName());
                    blobs.add(blob);
                }
            }
        }
        return blobs;
    }

}