Search in sources :

Example 1 with IProgressListener

use of com.helger.web.progress.IProgressListener in project ph-web by phax.

the class RequestMultipartHelper method handleMultipartFormData.

/**
 * Parse the provided servlet request as multipart, if the Content-Type starts
 * with <code>multipart/form-data</code>.
 *
 * @param aHttpRequest
 *        Source HTTP request from which multipart/form-data (aka file
 *        uploads) should be extracted.
 * @param aConsumer
 *        A consumer that takes either {@link IFileItem} or
 *        {@link IFileItem}[] or {@link String} or {@link String}[].
 * @return {@link EChange#CHANGED} if something was added
 */
@Nonnull
public static EChange handleMultipartFormData(@Nonnull final HttpServletRequest aHttpRequest, @Nonnull final BiConsumer<String, Object> aConsumer) {
    if (aHttpRequest instanceof MockHttpServletRequest) {
        // UnsupportedOperationExceptions
        return EChange.UNCHANGED;
    }
    if (!RequestHelper.isMultipartFormDataContent(aHttpRequest)) {
        // It's not a multipart request
        return EChange.UNCHANGED;
    }
    // It is a multipart request!
    // Note: this handles only POST parameters!
    boolean bAddedFileUploadItems = false;
    try {
        // Setup the ServletFileUpload....
        final ServletFileUpload aUpload = new ServletFileUpload(PROVIDER.getFileItemFactory());
        aUpload.setSizeMax(MAX_REQUEST_SIZE);
        aUpload.setHeaderEncoding(CWeb.CHARSET_REQUEST_OBJ.name());
        final IProgressListener aProgressListener = ProgressListenerProvider.getProgressListener();
        if (aProgressListener != null)
            aUpload.setProgressListener(aProgressListener);
        ServletHelper.setRequestCharacterEncoding(aHttpRequest, CWeb.CHARSET_REQUEST_OBJ);
        // Group all items with the same name together
        final ICommonsMap<String, ICommonsList<String>> aFormFields = new CommonsHashMap<>();
        final ICommonsMap<String, ICommonsList<IFileItem>> aFormFiles = new CommonsHashMap<>();
        final ICommonsList<IFileItem> aFileItems = aUpload.parseRequest(aHttpRequest);
        for (final IFileItem aFileItem : aFileItems) {
            if (aFileItem.isFormField()) {
                // We need to explicitly use the charset, as by default only the
                // charset from the content type is used!
                aFormFields.computeIfAbsent(aFileItem.getFieldName(), k -> new CommonsArrayList<>()).add(aFileItem.getString(CWeb.CHARSET_REQUEST_OBJ));
            } else
                aFormFiles.computeIfAbsent(aFileItem.getFieldName(), k -> new CommonsArrayList<>()).add(aFileItem);
        }
        // set all form fields
        for (final Map.Entry<String, ICommonsList<String>> aEntry : aFormFields.entrySet()) {
            // Convert list of String to value (String or String[])
            final ICommonsList<String> aValues = aEntry.getValue();
            final Object aValue = aValues.size() == 1 ? aValues.getFirst() : ArrayHelper.newArray(aValues, String.class);
            aConsumer.accept(aEntry.getKey(), aValue);
        }
        // name)
        for (final Map.Entry<String, ICommonsList<IFileItem>> aEntry : aFormFiles.entrySet()) {
            // Convert list of String to value (IFileItem or IFileItem[])
            final ICommonsList<IFileItem> aValues = aEntry.getValue();
            final Object aValue = aValues.size() == 1 ? aValues.getFirst() : ArrayHelper.newArray(aValues, IFileItem.class);
            aConsumer.accept(aEntry.getKey(), aValue);
        }
        // Parsing complex file upload succeeded -> do not use standard scan for
        // parameters
        bAddedFileUploadItems = true;
    } catch (final FileUploadException ex) {
        if (!StreamHelper.isKnownEOFException(ex.getCause()))
            LOGGER.error("Error parsing multipart request content", ex);
    } catch (final RuntimeException ex) {
        LOGGER.error("Error parsing multipart request content", ex);
    }
    return EChange.valueOf(bAddedFileUploadItems);
}
Also used : StreamHelper(com.helger.commons.io.stream.StreamHelper) ServletHelper(com.helger.servlet.ServletHelper) IFileItemFactoryProviderSPI(com.helger.web.fileupload.IFileItemFactoryProviderSPI) LoggerFactory(org.slf4j.LoggerFactory) ProgressListenerProvider(com.helger.web.progress.ProgressListenerProvider) EChange(com.helger.commons.state.EChange) RequestHelper(com.helger.servlet.request.RequestHelper) HttpServletRequest(javax.servlet.http.HttpServletRequest) FileUploadException(com.helger.web.fileupload.exception.FileUploadException) CWeb(com.helger.web.CWeb) IProgressListener(com.helger.web.progress.IProgressListener) Map(java.util.Map) BiConsumer(java.util.function.BiConsumer) Nonnull(javax.annotation.Nonnull) ServletFileUpload(com.helger.web.fileupload.servlet.ServletFileUpload) ArrayHelper(com.helger.commons.collection.ArrayHelper) CGlobal(com.helger.commons.CGlobal) Logger(org.slf4j.Logger) CommonsArrayList(com.helger.commons.collection.impl.CommonsArrayList) IFileItem(com.helger.web.fileupload.IFileItem) CommonsHashMap(com.helger.commons.collection.impl.CommonsHashMap) ICommonsList(com.helger.commons.collection.impl.ICommonsList) ServiceLoaderHelper(com.helger.commons.lang.ServiceLoaderHelper) MockHttpServletRequest(com.helger.servlet.mock.MockHttpServletRequest) ICommonsMap(com.helger.commons.collection.impl.ICommonsMap) ICommonsList(com.helger.commons.collection.impl.ICommonsList) MockHttpServletRequest(com.helger.servlet.mock.MockHttpServletRequest) IProgressListener(com.helger.web.progress.IProgressListener) ServletFileUpload(com.helger.web.fileupload.servlet.ServletFileUpload) CommonsHashMap(com.helger.commons.collection.impl.CommonsHashMap) IFileItem(com.helger.web.fileupload.IFileItem) Map(java.util.Map) CommonsHashMap(com.helger.commons.collection.impl.CommonsHashMap) ICommonsMap(com.helger.commons.collection.impl.ICommonsMap) CommonsArrayList(com.helger.commons.collection.impl.CommonsArrayList) FileUploadException(com.helger.web.fileupload.exception.FileUploadException) Nonnull(javax.annotation.Nonnull)

Aggregations

CGlobal (com.helger.commons.CGlobal)1 ArrayHelper (com.helger.commons.collection.ArrayHelper)1 CommonsArrayList (com.helger.commons.collection.impl.CommonsArrayList)1 CommonsHashMap (com.helger.commons.collection.impl.CommonsHashMap)1 ICommonsList (com.helger.commons.collection.impl.ICommonsList)1 ICommonsMap (com.helger.commons.collection.impl.ICommonsMap)1 StreamHelper (com.helger.commons.io.stream.StreamHelper)1 ServiceLoaderHelper (com.helger.commons.lang.ServiceLoaderHelper)1 EChange (com.helger.commons.state.EChange)1 ServletHelper (com.helger.servlet.ServletHelper)1 MockHttpServletRequest (com.helger.servlet.mock.MockHttpServletRequest)1 RequestHelper (com.helger.servlet.request.RequestHelper)1 CWeb (com.helger.web.CWeb)1 IFileItem (com.helger.web.fileupload.IFileItem)1 IFileItemFactoryProviderSPI (com.helger.web.fileupload.IFileItemFactoryProviderSPI)1 FileUploadException (com.helger.web.fileupload.exception.FileUploadException)1 ServletFileUpload (com.helger.web.fileupload.servlet.ServletFileUpload)1 IProgressListener (com.helger.web.progress.IProgressListener)1 ProgressListenerProvider (com.helger.web.progress.ProgressListenerProvider)1 Map (java.util.Map)1