在symfony 1中上传文件验证

时间:2012-08-08 14:25:31

标签: symfony1 upload

我用symfony1.0开发,我正在使用文件验证(validate / upload.yml):

    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

到目前为止一切都很好,但我还想对图像名称进行验证,我希望在数据库进行数据处理之前从无效字符中清除名称?

修改

当然不是这样现在我在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

所以现在我有很多存储在数据库中的图像名称与invlaid charater,所以我希望创建一个脚本或方法来传播所有数据在feald“image_name”并直接更改DB中的所有无效字符,我的第一个想法是使用“任务”?!任何想法?

EDIT-3

所以现在我按照那样制作我的批次:

<?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 **********************************/
       ?>

所以我可以从数据库中的文件名更改无效字符,我的新问题是如何在他的目录中更改文件名,我的意思是更改文件本身的文件名,我不知道怎么办?

修改-4

所以这是我的最终代码:

批次/ 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;
        }

如果您发现任何错误或优化,请告诉我......

1 个答案:

答案 0 :(得分:2)

您可以使用striptext方法在generateUniqueName函数中清理文件名。例如,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;
  }
}

然后:

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

    return $finalFileName;
}

修改

对于第二个请求,您应该创建一个任务。事实上,这是一项任务,但在sf1.0中称为 batch 。见the short doc here。基本上是:

  • 您获取所有图片表
  • 你清理所有名字
  • 使用新名称重命名磁盘上的所有图像

编辑2:

如果您对utf8有疑问,请与Doctrine_Inflectorurlize核对。

然后使用:

$finalFileName    = Doctrine_Inflector::urlize($fileName).'-'.$fileUniqueSuffix.$fileExtension;