Thinkphp手册中对于多文件上传描述的很清楚:如果需要使用多个文件只需要修改表单,把

<input type='file' name='photo'>

改为

    <li><input type='file' name='photo1'></li>
    	<li><input type='file' name='photo2'></li>
    	<li><input type='file' name='photo3'></li>
    </ol>
    

    或者

      	<li><input type='file' name='photo[]'></li>
      	<li><input type='file' name='photo[]'></li>
      	<li><input type='file' name='photo[]'></li>
      

    这样就可以多文件上传了,确实没错,但是有个问题,每个上传表单域对应一个数据库字段。当然,上传成功的文件是需要保存数据库的。而手册上的这种写法就不行了,上传方法是在model里面写的,用的自动完成。但是表单域的name都是一个名字,这样上传的时候三个表单域都进了一个自动完成方法,只返回一个值。所以我想到了一个方法,但是总感觉官方会有更好的方法解决这个问题。搜索引擎搜遍了,没有我想要的效果。只能自己写了。

    暂且自己的上传表单域为两个,一个上传图片,一个上传视频。字段名为image、video。

    html代码如下

    图片:<input type="file" name="image[]">
    
    视频:<input type="file" name="video[]">
    

    model代码:

    protected $info= '';
    
    protected $_auto = array(
    array('image','upload',3,callback),//自动完成方法
    array('video','videoupload',3,callback), //自动完成方法
    );//自动填充上传图片生成缩略图
    protected function upload(){
    $var = $_FILES['image']['name'];
    import('ORG.Net.UploadFile');
    $upload = new UploadFile();
    $upload->saveRule  = time;
    $upload->allowExts  = array('jpg', 'gif', 'png', 'zip','flv');
    $upload->thumb = true;
    //视频路径。。。只支持flv后缀,
    $upload->videopath = './Public/upload/Video/';
    $upload->savePath =  './Public/upload/images/';
    $upload->thumbPrefix = '250_115_,150_110_,213_156_';
    $upload->thumbMaxWidth='250,150,213';
    $upload->thumbMaxHeight='115,110,156';
    if(!in_array('',$var) || !in_array('',$_FILES['video']['name'])){
    if(!$upload->upload()) {
    echo $upload->getErrorMsg();die;
    }else{
    $this->info =  $upload->getUploadFileInfo();
    if(!in_array('',$var) &amp;&amp; !in_array('',$_FILES['video']['name'])){
    return $this->info[1]['savename'];
    }elseif(!in_array('',$var)){
    return $this->info[0]['savename'];
    }else{
    return false;
    }
    
    }
    }else{
    return flase;
    }
    }
    //上传视频
    protected function videoupload(){
    if(!in_array('',$var) &amp;&amp; !in_array('',$_FILES['video']['name'])){
    return $this->info[0]['savename'];
    }elseif(!in_array('',$_FILES['video']['name'])){
    return $this->info[1]['savename'];
    }else{
    return false;
    }
    
    }
    

    自始至终感觉能有非常简便的解决方法,但是摸不着其要领。这也算是一个勉强的解决方案。如果有人遇到过这个问题,欢迎与松林交流。松林渴望简单的解决这个问题。百度、google、bing、都没有查询到问题。

     

     

     

     

    文章均属 松林's blog 原创 转载请注明转自  松林's blog

    本文地址 : http://www.songlin51.com/archives/896.html