UploadUtil.java

  1. /*
  2.  * Copyright (c) 2002-2022, City of Paris
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  *  1. Redistributions of source code must retain the above copyright notice
  10.  *     and the following disclaimer.
  11.  *
  12.  *  2. Redistributions in binary form must reproduce the above copyright notice
  13.  *     and the following disclaimer in the documentation and/or other materials
  14.  *     provided with the distribution.
  15.  *
  16.  *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
  17.  *     contributors may be used to endorse or promote products derived from
  18.  *     this software without specific prior written permission.
  19.  *
  20.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23.  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
  24.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  25.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  26.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  27.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  28.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  30.  * POSSIBILITY OF SUCH DAMAGE.
  31.  *
  32.  * License 1.0
  33.  */
  34. package fr.paris.lutece.util.filesystem;

  35. import fr.paris.lutece.util.string.StringUtil;

  36. /**
  37.  * This class provides utilities for uploaded files
  38.  */
  39. public final class UploadUtil
  40. {
  41.     /**
  42.      * Creates a new UploadUtil object.
  43.      */
  44.     private UploadUtil( )
  45.     {
  46.     }

  47.     /**
  48.      * Removes special characters contained in the file name
  49.      *
  50.      * @param strName
  51.      *            the file name
  52.      * @return strClearName the cleaned file name
  53.      */
  54.     public static String cleanFileName( String strName )
  55.     {
  56.         return cleanString( strName, false );
  57.     }

  58.     /**
  59.      * Removes special characters contained in a file path. This method performs the same transformation as cleanFileName but leaves out the slashes.
  60.      *
  61.      * @param strPath
  62.      *            The path to clean
  63.      * @return The cleaned path
  64.      */
  65.     public static String cleanFilePath( String strPath )
  66.     {
  67.         return cleanString( strPath, true );
  68.     }

  69.     /**
  70.      * Helper method for cleanFileName and cleanFilePath.
  71.      *
  72.      * @param strValue
  73.      *            The string literal to clean
  74.      * @param bKeepSlashes
  75.      *            Set to true to keep slashes, false to replace them
  76.      * @return The cleaned string literal
  77.      */
  78.     private static String cleanString( String strValue, boolean bKeepSlashes )
  79.     {
  80.         // First, replace the accents :
  81.         String strNoAccents = StringUtil.replaceAccent( strValue );

  82.         // Convert to an array of characters
  83.         char [ ] characters = new char [ strNoAccents.length( )];
  84.         strNoAccents.getChars( 0, strNoAccents.length( ), characters, 0 );

  85.         // Iterate to process one character at a time
  86.         for ( int i = 0; i < strNoAccents.length( ); i++ )
  87.         {
  88.             char current = characters [i];

  89.             // Valid characters are : '.', alphanumeric (a-zA-Z0-9),
  90.             // and '/' if bKeepSlashes is true.
  91.             boolean bValid = ( ( current == '.' ) || ( ( current >= '0' ) && ( current <= '9' ) ) || ( ( current >= 'a' ) && ( current <= 'z' ) )
  92.                     || ( ( current >= 'A' ) && ( current <= 'Z' ) ) || ( bKeepSlashes && ( current == '/' ) ) );

  93.             // Other characters are replaced by underscore.
  94.             if ( !bValid )
  95.             {
  96.                 characters [i] = '_';
  97.             }
  98.         }

  99.         // Return result as a string
  100.         return String.valueOf( characters );
  101.     }
  102. }