Package com.evasion.common.inputfile

Source Code of com.evasion.common.inputfile.UploadFilter

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.evasion.common.inputfile;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.*;
import java.io.File;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
*
* @author sebastien.glon
*/
public class UploadFilter implements Filter {

    String repositoryPath;

    @Override
    public void init(FilterConfig config) throws ServletException {
        setRepositoryPath(config);
    }

    @SuppressWarnings("unchecked")
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        if ((request instanceof HttpServletRequest)) {
            HttpServletRequest httpRequest = (HttpServletRequest) request;

            if (ServletFileUpload.isMultipartContent(httpRequest)) {
                //-----------------------------------------------------
                DiskFileItemFactory factory = new DiskFileItemFactory();

                factory.setRepository(new File(repositoryPath));

                ServletFileUpload upload = new ServletFileUpload(factory);

                try {

                    List<FileItem> items = (List<FileItem>) upload.parseRequest(httpRequest);
                    final Map<String, String[]> map = new HashMap<String, String[]>();

                    for (FileItem item : items) {
                        if (item.isFormField()) {
                            processFormField(item, map);
                        } else {
                            processFileField(item, httpRequest);
                        }
                    }

                    request = UploadFilter.wrapRequest(httpRequest, map);

                } catch (FileUploadException ex) {
                    ServletException servletEx = new ServletException();
                    servletEx.initCause(ex);
                    throw servletEx;
                }
            }
        }
        chain.doFilter(request, response);
    }

    private static HttpServletRequest wrapRequest(HttpServletRequest request,
            final Map<String, String[]> parameterMap) {
        return new HttpServletRequestWrapper(request) {
            // inner methods passed as parameters

            @Override
            public Map<String, String[]> getParameterMap() {
                return parameterMap;
            }

            @Override
            public String[] getParameterValues(String name) {
                return (String[]) parameterMap.get(name);
            }

            @Override
            public String getParameter(String name) {
                String[] params = getParameterValues(name);
                if (params == null) {
                    return null;
                }
                return params[0];
            }

            @Override
            public Enumeration<String> getParameterNames() {
                return Collections.enumeration(parameterMap.keySet());
            }
        };
    }

    private void processFormField(FileItem formField,
            Map<String, String[]> parameterMap) {
        String name = formField.getFieldName();
        String value = formField.getString();
        String[] values = parameterMap.get(name);

        if (values == null) {
            // Not in parameter map yet, so add as new value.
            parameterMap.put(name, new String[]{value});
        } else {
            // Multiple field values, so add new value to existing array.
            int length = values.length;
            String[] newValues = new String[length + 1];
            System.arraycopy(values, 0, newValues, 0, length);
            newValues[length] = value;
            parameterMap.put(name, newValues);
        }
    }

    private void processFileField(FileItem fileField, HttpServletRequest request) {
        request.setAttribute(fileField.getFieldName(), fileField);
    }

    /**
     * Method for retrieving the temporary directory for storing uploaded file
     * By default the system's temporary directory will be used if no reposistory path is configure in the web.xml
     * @param config
     */
    private void setRepositoryPath(FilterConfig config) {
        String repositoryPath = config.getInitParameter("org.idc.sis.UploadFilter.repositoryPath");
        if (repositoryPath == null || repositoryPath.isEmpty()) {
            repositoryPath = System.getProperty("java.io.tmpdir");
        }
        if (!repositoryPath.endsWith("/")) {
            repositoryPath += "/";
        }
        this.repositoryPath = repositoryPath;
    }

    @Override
    public void destroy() {
    }
}
TOP

Related Classes of com.evasion.common.inputfile.UploadFilter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.