Shawn 2012-01-30 13:00:10 4478次浏览 2条回复 0 0 0

背景: 上传文件到远程服务器 需求:

  1. 只允许上传指定类型的文件
  2. 文件不上传到本地服务器
  3. 使用curl上传到远程服务器

Model

<?php
/**
 * @property string $image 
* the uri of the image on remote server
 */
class User extends CActiveRecord
{
    public function rules()
    {
        return array(
            array('image', 'file', 'types'=>'jpg, gif, png'),
    }
}

View

<div class="row">
    <?php echo $form->labelEx($model,'image'); ?>
    <?php echo CHtml::ActiveFileField($model,'image'); ?>
    <?php echo $form->error($model,'image'); ?>
</div>

Controller

public function actionCreate()
{
    $model=new User;
    $result = array();

    if(isset($_POST['User']))
    {
        $model->attributes=$_POST['User'];
        $img = CUploadedFile::getInstance($model, 'image');  
        if( is_object($img) && get_class($img) === 'CUploadedFile' ){  
            $result = put($img->tempName, $img->name);
            $model->image = $result['uri'];
        }
        if($model->save())
            $this->redirect(array('view','id'=>$model->id));
    }

    $this->render('create',array(
        'model'=>$model,
    ));
}
function put($path, $filename){
$postField = file_get_contents((realpath($path)));
        $process = curl_init($this->uri.$filename);
        curl_setopt($process, CURLOPT_POST, 1);
        curl_setopt($process, CURLOPT_POSTFIELDS, $postField);
        curl_setopt($process, CURLOPT_USERPWD, $this->username.':'.$this->userpass);
        curl_setopt($process, CURLOPT_HTTPHEADER, array('Expect:', "Mkdir:true"));
        curl_setopt($process, CURLOPT_HEADER, 0);
        curl_setopt($process, CURLOPT_TIMEOUT, 30);
        curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
        curl_exec($process);
        curl_getinfo($process, CURLINFO_HTTP_CODE);
        curl_close($process);
return $this->uri.$filename;
}

如果是上面的代码,那么文件就会在没有validation的情况下先上传的了,那么是不是需要before save validate,重新看手册,发现validate() method - Performs the validation,只需要修改代码为以下就okey了。

if($model->validate()){
    $img = CUploadedFile::getInstance($model, 'image');  
    if( is_object($img) && get_class($img) === 'CUploadedFile' ){  
        $result =put($img->tempName, $img->name);
        $model->image = $result['uri'];
    }
    if($model->save())
        $this->redirect(array('view','id'=>$model->id));
}

还有一个问题,如何不给服务器上传临时文件,而是直接将本地文件上传到远程服务器?谢谢,如果有更好的解决办法。

  • 回复于 2012-01-30 15:49 举报

    可以考虑一下 使用FTP的方法

  • 回复于 2012-01-30 16:10 举报

    谢谢。但是ftp 依然是对用户不可见,因此仍然需要本地文件的路径阿。是否可以扩展CModel的Save 或者 图片的SaveAs 方法呢?

您需要登录后才可以回复。登录 | 立即注册