我正在尝试上传目录中的图像文件(/ 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
答案 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)
您可能需要考虑将文件数据存储到数据库中,这样检索文件列表会更容易,更快,您也可以更灵活地排序和过滤。