zhenhua2340

zhenhua2340

这家伙有点懒,还没写个性签名!

  • 财富值1000
  • 威望值0
  • 总积分1160

个人信息

  • 2016-12-04 已签到
    连续签到29天,获得了20个金钱
  • 2016-12-02 已签到
    连续签到27天,获得了20个金钱
  • 2016-12-01 已签到
    连续签到26天,获得了20个金钱
  • 2016-11-29 已签到
    连续签到24天,获得了20个金钱
  • 2016-11-30 已签到
    连续签到25天,获得了20个金钱
  • 2016-11-28 已签到
    连续签到23天,获得了20个金钱
  • 回复了 的回答

    我看了你的代码,视图里边,如果不要多文件上传,就把multiple去掉,万一有人一次选多张,就只能上传最后一张。

    $model->images 为 NULL 说明你提交的信息没获取到。html部分的代码写的有问题,应该这样写:

    <input id="input-700" name="UploadForm[thumb]" type="file" >
    

    控制器里边的代码分析:

    public function actionIndex()
        {
            $response = [];
    
            if (Yii::$app->request->isPost) {
    
                $model = new UploadForm();  // 没问题
    
                $model->images = UploadedFile::getInstance($model, 'thumb'); // 如果form表单没写错的话,应该也没问题
    
                $response['images'] = $model->images;     // 这一句代码是把一个图片对象赋值给$response,没用
                $response['url'] = $model->upload();      // 这一句代码,是对的,但是不全对。因为UploadForm你都没写,里边的upload方法也是没有。
                $response['id']  = Yii::$app->request->post('id'); // 这个id有什么用,不太理解。
                $response['file'] = $_FILES;              // 把$_FILES都返回回来了,什么鬼?
                $response['post'] = Yii::$app->request->post(); // 这句代码没用
    
            }
            echo Json::encode($response);
        }
    

    我修改了一下你的代码,如下:

    public function actionIndex()
        {
            $response['error'] = 1;    // 设置返回的信息
    
            if (Yii::$app->request->isPost) {
    
                $model = new UploadForm(); 
    
                $model->images = UploadedFile::getInstance($model, 'thumb');
    
                $uploadres = $model->upload();  // 调用model的upload方法,这个方法需要去实现。
    
                if ($uploadres['error'] == 0) {
                    $response['id'] = $uploadres['id']; // 上传成功返回的图片id
                    $response['url'] = $uploadres['url'];  // 上传成功返回的图片url
                    $response['error'] = 0;             // 上传成功的表示,在前端js判断
                } else {
                    $response['errmsg'] = $uploadres['errmsg'];  // 赋值图片上传的错误信息,在前台输出
                }
    
            }
            echo Json::encode($response);
        }
    

    UploadForm里边的代码你可以参考一下这个,做一些修改就好了:

    <?php
    namespace app\models;
    
    use yii\base\Model;
    
    class UploadForm extends Model
    {
        public $thumb;  //用来保存文件
    
        public function rules(){
            return [
                [['thumb'],'file', 'skipOnEmpty' => false, 'extensions' => 'jpg, png, gif', 'mimeTypes'=>'image/jpeg, image/png, image/gif', 'maxSize'=>1024*1024*10, 'maxFiles'=>1],
                //设置图片的验证规则
            ];
        }
    
        public function upload(){
            $res = [];
            if ($this->validate()){ //调用验证方法
                $uploadpath = dirname(dirname(__FILE__)).'/web/uploads/';  //取得上传路径
                if (!file_exists($uploadpath)) {
                    @mkdir($uploadpath, 0777, true);
                }
                
                    $ext = $this->thumb->getExtension();  //获取文件的扩展名
                    $randnums = $this->getrandnums(); //生成一个随机数,为了重命名文件
                    $imageName = date("YmdHis").$randnums.'.'.$ext;  // 重命名文件
                    $filepath = $uploadpath.$imageName;  // 生成文件的绝对路径
                    if($this->thumb->saveAs($filepath)){    //上传,并保存结果
                        $res['error'] = 0;
                    }
    
                    // 还应该有保存到数据库的操作,这个你自己写吧,写完以后把id和url放到$res里边返回给控制器就可以了
                }
            }
    
            return $res; //返回结果
        }
    
        /**
         * 生成随机数
         * @return string 随机数
         */
        protected function getrandnums()
        {
            $arr = array();
            while (count($arr) < 10) {
                $arr[] = rand(1, 10);
                $arr = array_unique($arr);
            }
            return implode("", $arr);
        }
    }
    ?>
    
    $response['images'] = $model->images;
    $response['url'] = $model->upload();   其实就这一条是“有用”的,其他的都是调试,输出信息方便查看而已
    $response['id']  = Yii::$app->request->post('id');
    $response['file'] = $_FILES;
    $response['post'] = Yii::$app->request->post();
    
  • 回复了 的回答

    被你的思路带偏了。图片上传一个方法就能搞定了。如果你有不同的表单要保存不同的图片,最好的做法是把文件上传的name值都写成一样的,调用一个方法ajax上传图片,完成以后,返回一个文件id,或者图片路径,用ajax把返回的值放到隐藏域里边,最后跟表单一起提交就行了。这样就获得了保存了图片的信息。也不用写多个接收文件上传的代码。如果还有问题可以跟我联系~~~~

    其实这段话,才是 “ 最佳答案 ” ^ _ ^

    点错了, 不能修改,算了....

    文件上传的name值都写成一样的,调用一个方法ajax上传图片,完成以后,返回一个文件id,或者图片路径,用ajax把返回的值放到隐藏域里边  
    

    被 这句就点醒了

    非常感谢 !!!

  • 2016-11-26 已签到
    连续签到21天,获得了20个金钱
  • 2016-11-27 已签到
    连续签到22天,获得了20个金钱
经理 等级规则
1160/2000
资料完整度
20/100
用户活跃度
0/100

Ta的关注

2

Ta的粉丝

4

Ta的访客

14