0

私は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 で sving する前に関数を使用しています。

    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;
}

編集-2 :

だから今、私は無効な文字でデータベースに保存されている画像の名前をたくさん持っているので、フィールド「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 **********************************/
  ?>

クラス 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;
        }

エラーや最適化が表示された場合は教えてください...

4

1 に答える 1

2

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;
}

編集

そして、2番目のリクエストでは、タスクを作成する必要があります。実際、これはタスクですが、sf1.0ではバッチと呼ばれています。こちらの短いドキュメントをご覧ください。基本的に:

  • すべての画像テーブルを取得します
  • あなたはすべての名前を消毒します
  • ディスク上のすべてのイメージの名前を新しい名前に変更します

編集2:

utf8に問題がある場合は、 Doctrine_Inflectorurlizeから確認する必要があります。

次に、以下を使用します。

$finalFileName    = Doctrine_Inflector::urlize($fileName).'-'.$fileUniqueSuffix.$fileExtension;
于 2012-08-08T15:32:18.720 に答える