以上传的序列yii php检索上传的文件

时间:2014-09-10 06:43:52

标签: php file-upload yii

我正在尝试上传目录中的图像文件(/ images / users / photos)并在视图中显示上传的图像。这是工作。 这是我在控制器中上传图像文件的代码。

 public function actionImage() {
    $model = new ImageUpload ( 'user' );

    if (isset ( $_POST ['ImageUpload'] )) {
        $model->attributes = $_POST ['ImageUpload'];
        $model->image = CUploadedFile::getInstance ( $model, 'image' );
        if ($model->validate ()) {
            $path = realpath ( dirname ( $model->image ) );
            $imagePath = $path . Yii::app ()->params ['logoUploadPath'] . $model->image;
            $model->image->saveAs ( $imagePath );   
        } 
    } else {
        Yii::app ()->user->setFlash ( 'image-error', "Please select file!" );
    }
    $this->redirect ( 'index', array (
            'model' => $model 
    ) );
}

在视图中,我使用以下代码显示上传的图像。

 <?php 
            $files = CFileHelper::findFiles(Yii::app()->basePath."/..".Yii::app()->params['logoUploadPath'],array('fileTypes'=>array('gif','png','jpg','jpeg'),'level'=>0));
            foreach ($files as $file)
            {   
                $upload = new ImageUpload();
                $image = basename($file);
                $src = Yii::app()->params['logoUploadPath'].$image;
                ?>
                <div class="img-wraplogo">
                    <?php  echo CHtml::image($src,$image,array("title"=>'Image', 'class'=>'existing-thumbnail-image')); ?>
                </div>  
<?php }}?>

问题在于此 图像文件以视图中的字母顺序出现。但我想按照他们的上传顺序显示它们。

例如:我上传了两个文件,首先是B.png然后是A.png,我的视图首先显示A.png然后显示B.png。但我想首先显示B.png然后A.png。

请帮我弄清楚上面的场景或任何提示来实现这一点。 我上传的图片路径是 / images / users / photos

4 个答案:

答案 0 :(得分:1)

正如您从CFileHelper方法中看到的那样:

public static function findFiles($dir,$options=array())
{
    $fileTypes=array();
    $exclude=array();
    $level=-1;
    extract($options);
    $list=self::findFilesRecursive($dir,'',$fileTypes,$exclude,$level);
    sort($list);
    return $list;
}

使用sort()函数。您不需要此默认排序方法。但是,此方法不接受修改排序函数的参数。

因此,唯一的方法是编写自己的CustomFileHelper类,该类从CFileHelper扩展,并重写您自己的函数,而不是按日期排序。

如果您实际编写了一些代码来扩展此类,但遇到问题,请使用您尝试过的代码发布一个新问题。

或者,您可以搜索non-Yii PHP solution

答案 1 :(得分:1)

解决方案需要PHP 5.3。

$files = CFileHelper::findFiles(Yii::app()->basePath."/..".Yii::app()->params['logoUploadPath'],array('fileTypes'=>array('gif','png','jpg','jpeg'),'level'=>0));

usort($files, function($a, $b) {
      return filemtime($a) < filemtime($b);
 });

或试试这个:

usort($files, create_function('$a,$b', 'return filemtime($a)<filemtime($b);'));

答案 2 :(得分:1)

我做了类似的事情并且有效!

    $files = CFileHelper::findFiles(Yii::app()->basePath."/..".Yii::app()->params['logoUploadPath'],array('fileTypes'=>array('gif','png','jpg','jpeg'),'level'=>0));       
    $results = array();
    foreach ($files as $file){
            $results[] = array('file' => $file, 'time' => filemtime($file));
    }
    uasort($results, function($file1, $file2) {
        if ( $file1['time'] == $file2['time'] )
            return 0;                   
        return $file1['time'] > $file2['time'] ? -1 : 1;
    });
   foreach ($results as $file)
        {   
            $upload = new ImageUpload();
            $image = basename($file);
            $src = Yii::app()->params['logoUploadPath'].$image;
            ?>
            <div class="img-wraplogo">
                <?php  echo CHtml::image($src,$image,array("title"=>'Image', 'class'=>'existing-thumbnail-image')); ?>
            </div>  
   <?php }?>

答案 3 :(得分:0)

您可能需要考虑将文件数据存储到数据库中,这样检索文件列表会更容易,更快,您也可以更灵活地排序和过滤。