0

Im develloping with symfony1.0,I'm using a file validation(validate/upload.yml) like that :

    methods:
              post:               [logo_file]
              get:                [logo_file]

    names:
              logo_file:
              required:         Yes
              required_msg:     Please select a file to upload 23008
              validators:       myFileValidator
               file:             true

    myFileValidator:
              class:              sfFileValidator
              param:
                    mime_types:       
                            - 'image/jpeg'
                            - 'image/png'
                            - 'image/gif'
                            - 'image/x-png'
                            - 'image/pjpeg'    
    mime_types_error: Only PNG, GIF and JPEG images files are allowed 23009
    max_size:         512000
    max_size_error:   Max size is 512Kb 23010

And all is fine until now but I wanna also make a validation for name of image,I hope to sanitze the name from Invalid character before stroring at database?

EDIT

Of course not so now Im using a function before sving in DB :

    public static function generateUniqueName($fileName, $fileExtension)
{
    // Create a name 
    $fileUniqueSuffix=PublicIdGeneratorPeer::getPublicIdForTable(self::UNIQUE_FILE_ID);
    $finalFileName = $fileName.'-'.$fileUniqueSuffix.$fileExtension;

   //here I want to replace or remove invalid character from  $filename 

    return $finalFileName;
}

EDIT-2 :

So now I have a lot of name of image stored in database with invlaid charater,so I hope to create a script or a way to travel all data in feald "image_name" and change all invalid character in DB directly,my first idea it's to use a "task"?!Any idea?

EDIT-3 :

So now I make my batch like that :

<?php
   define('SF_ROOT_DIR',    realpath(dirname(__FILE__).'/..'));
   define('SF_APP',         'backend');
   define('SF_ENVIRONMENT', 'prod');
    define('SF_DEBUG',       false);

   // symfony directories
      require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');

     sfContext::getInstance();

 /********************************** Begin **********************************/


         $criteria = new Criteria();
           $listCompanyLogo = CompanyLogoPeer::doSelect($criteria);


         foreach($listCompanyLogo as $CompanyLogo)
      {
 if(!is_null($CompanyLogo))
       {


       $filename= $CompanyLogo->getFileName();
       $filepath=$CompanyLogo->getFilePath();
       $fileurl=$CompanyLogo->getFileUrl();



       $finalFileName=StringTool::stripText($filename);
       $finalFilePath=StringTool::cleanUrl($filename,$filepath);
       $finalFileUrl=StringTool::cleanUrl($filename,$fileurl);



       $CompanyLogo->setFileName($finalFileName);
       $CompanyLogo->setFilePath($finalFilePath);
       $CompanyLogo->setFileUrl($finalFileUrl);


       $CompanyLogo->save();

       echo ' the name of logo : '.$filename.' is modified by  ==============>'.$finalFileName.'<br>' ;
       exit();
       }

       }

         /********************************** End **********************************/
       ?>

So I can change the invalid character from the name of file in database,my new problem is how to change the name of file in his direcotry,I mean change the name of file of the file itself,I dont know how?

Edit-4

So here it's my final code :

batch/updatelogoName.php

   <?php
   define('SF_ROOT_DIR',    realpath(dirname(__FILE__).'/..'));
   define('SF_APP',         'backend');
   define('SF_ENVIRONMENT', 'prod');
   define('SF_DEBUG',       false);

    // symfony directories
           require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');

   sfContext::getInstance();

   /********************************** Begin **********************************/


   $criteria = new Criteria();
   $listCompanyLogo = CompanyLogoPeer::doSelect($criteria);


foreach($listCompanyLogo as $CompanyLogo)
 {
 if(!is_null($CompanyLogo))
       {


       $filename= $CompanyLogo->getFileName();
       $filepath=$CompanyLogo->getFilePath();
       $fileurl=$CompanyLogo->getFileUrl();
       $thumbnailName= $CompanyLogo->getThumbnailName();
       $ThumbnailPath= $CompanyLogo->getThumbnailPath();
       $ThumbnailUrl= $CompanyLogo->getThumbnailUrl();


       $finalFileName=StringTool::cleanName($filename);
       $finalFilePath=StringTool::cleanUrl($filename,$filepath);
       $finalFileUrl=StringTool::cleanUrl($filename,$fileurl);
       $finalThumbnailName=StringTool::cleanName($thumbnailName);
       $finalThumbnailPath=StringTool::cleanUrl($filename,$ThumbnailPath);
       $finalThumbnailUrl=StringTool::cleanUrl($filename,$ThumbnailUrl);


       $CompanyLogo->setFileName($finalFileName);
       $CompanyLogo->setFilePath($finalFilePath);
       $CompanyLogo->setFileUrl($finalFileUrl);
       $CompanyLogo->setThumbnailName($finalThumbnailName);
       $CompanyLogo->setThumbnailPath($finalThumbnailPath);
       $CompanyLogo->setThumbnailUrl($finalThumbnailUrl);

       $CompanyLogo->save();


       if(rename('../web/'.$ThumbnailUrl, '../web/'.$finalThumbnailUrl) !== 'false')
       {
             rename('../web/'.$ThumbnailUrl, '../web/'.$finalThumbnailUrl);
       }

       echo 'The logo : '.$filename.' is modified by ==============>'.$finalFileName.'<br>' ;

       }

 }

    /********************************** End **********************************/
  ?>

Class StringTool.php :

            public static function stripText($text)
    {
        $accFrom = array('ë','é','è','ê','Ê','Ë','É','È','à','â','á','ä','ã','å','Â','Å','À','Á','Ã','Ä','ç','Ç','Î','Ï','Ì','Í','ì','í','î','ï','Ó','Ô','Õ','Ö','ò','ó','ô','õ','ö','Ù','Ú','Û','Ü','ù','ú','û','ü');
        $accTo =   array('e','e','e','e','e','e','e','e','a','a','a','a','a','a','a','a','a','a','a','a','c','c','i','i','i','i','i','i','i','i','o','o','o','o','o','o','o','o','o','u','u','u','u','u','u','u','u');

        $text = str_replace($accFrom,$accTo,$text);

        $text = strtolower($text);

        // strip all non word chars
        $text = preg_replace('/\W/', ' ', $text);

        // replace all white space sections with a dash
        $text = preg_replace('/\ +/', '-', $text);

        // trim dashes
        $text = preg_replace('/\-$/', '', $text);
        $text = preg_replace('/^\-/', '', $text);

        return $text;
    }

     /*
     * Remove extnesion File
     * 
     */

     public static function RemoveExtension($fileName)
         {
            $extension = strrchr($fileName, '.');

            if($extension !== false)
              {
                $fileName = substr($fileName, 0, -strlen($extension));
              }
            return $fileName;
         }

     /*
     * Remove all non alpha-numeric characters from URLs and Files
     * 
     */


      public static function  cleanName ($fileName)
        {

         $extension = pathinfo($fileName, PATHINFO_EXTENSION);
         $extremove = self::RemoveExtension($fileName);
         $result = self::stripText($extremove);

         $finaleFileName= $result.'.'.$extension;

         return $finaleFileName;

        }

      public static function cleanUrl($fileName,$filePath)
        {

         $finaleFileName = self::cleanName($fileName);
         $finaleFilePath=str_replace($fileName, $finaleFileName, $filePath);

         return $finaleFilePath;
        }

If you see any error or optimization tell me...

6
  • Are you sure about the indentation of your yml ? Commented Aug 8, 2012 at 14:31
  • @j0k I edit my first message,you see my answer... Commented Aug 8, 2012 at 15:18
  • Then why don't you sanitize in generateUniqueName ? Commented Aug 8, 2012 at 15:26
  • 1
    Version 1.0 is very old these days - I'd recommend you upgrade to 1.3, and the changes are quite minimal (aside from the Form changes, which are huge, but they are not mandatory until 1.4). Commented Aug 8, 2012 at 15:51
  • I know halfer,it's justa simple correction we will rebuild it with symfony 2.1.. Commented Aug 8, 2012 at 16:14

1 Answer 1

2

You can cleanup your file name in your generateUniqueName function using a striptext method. For example, the one used in Askeet:

<?php

class myTools
{
  public static function stripText($text)
  {
    $text = strtolower($text);

    // strip all non word chars
    $text = preg_replace('/\W/', ' ', $text);

    // replace all white space sections with a dash
    $text = preg_replace('/\ +/', '-', $text);

    // trim dashes
    $text = preg_replace('/\-$/', '', $text);
    $text = preg_replace('/^\-/', '', $text);

    return $text;
  }
}

Then:

public static function generateUniqueName($fileName, $fileExtension)
{
    // Create a name 
    $fileUniqueSuffix = PublicIdGeneratorPeer::getPublicIdForTable(self::UNIQUE_FILE_ID);
    $finalFileName    = myTools::stripText($fileName).'-'.$fileUniqueSuffix.$fileExtension;

    return $finalFileName;
}

edit:

And for your second request, you should create a task. In fact, it's a task but it's called batch in sf1.0. See the short doc here. Basically:

  • you fetch all your image table
  • you sanitize all name
  • you rename all image on disk with the new name

edit 2:

If you have problem with utf8, you should check with urlize from Doctrine_Inflector.

Then use:

$finalFileName    = Doctrine_Inflector::urlize($fileName).'-'.$fileUniqueSuffix.$fileExtension;
Sign up to request clarification or add additional context in comments.

10 Comments

@jOk I make a new Edit please you can see my first message
Ok I have a file name in database and directory with this name "Aranès.jpg",but when i get the name from databse to put it in rename so I have "aran├¿s.jpg" so rename retrun flase
I think you should rename the filename not the whole path.
yes i know I do with the whole path,to explain i gave you juste the name of file,its a problem with encodation UTF8 because when i remove "è" it's works fine
No problem, you just have to include this lonely class. It doesn't use anything from Doctrine except the name (that you can rename btw)
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.