示例#1
0
 /**
  * 执行上传文件
  *
  * @param QDB_ActiveRecord_Abstract $obj
  */
 function _exec_upload(QDB_ActiveRecord_Abstract $obj)
 {
     if (empty($this->_settings['upload_config'])) {
         return;
     }
     $uploader = new Helper_Uploader();
     $error = array();
     foreach ($this->_settings['upload_config'] as $file_id => $config) {
         //必需
         $post_key = isset($config['post_key']) ? $config['post_key'] : $file_id;
         if (!$uploader->existsFile($post_key)) {
             if (isset($config['required']) && $config['required']) {
                 if ($obj->id() && !empty($obj->{$file_id})) {
                     $obj->willChanged($file_id);
                 } else {
                     $error[$post_key]['required'] = $config['errmsgs']['required'];
                 }
             }
             continue;
         }
         $file = $uploader->file($post_key);
         $filename = $file->filename();
         $extname = $file->extname();
         // 验证文件类型
         if (isset($config['allowed_filetypes']) && $config['allowed_filetypes']) {
             if (!$file->isValid($config['allowed_filetypes'])) {
                 $error[$post_key]['allowed_filetypes'] = $config['errmsgs']['allowed_filetypes'];
                 continue;
             }
         } else {
             if ($file->isValid('.php')) {
                 $error[$post_key]['allowed_filetypes'] = "PHP 文件是不允许上传的.";
                 continue;
             }
         }
         //验证文件大小
         if (isset($config['max_size']) && $config['max_size'] > 0) {
             if ($file->filesize() > $config['max_size'] * 1024) {
                 $error[$post_key]['max_size'] = $config['errmsgs']['max_size'];
                 continue;
             }
         }
         // 验证图片尺寸
         if (isset($config['image_dimension']) && $config['image_dimension']) {
             list($width, $height, $type, $attr) = getimagesize($file->filepath());
             if (!$width || !$height) {
                 continue;
             }
             list($dim_width, $dim_height) = explode('*', $config['image_dimension']);
             if (isset($dim_width) && $dim_width > 0 && $dim_width != $width || isset($dim_height) && $dim_height > 0 && $dim_height != $height) {
                 $error[$post_key]['image_dimension'] = $config['errmsgs']['image_dimension'];
                 continue;
             }
         }
         $dir = rtrim($config['upload_dir'], '/\\') . DS;
         $date = date('Y-m');
         $dest_dir = $dir . $date;
         Helper_Filesys::mkdirs($dest_dir);
         $md5 = md5($filename . '-' . microtime(true));
         $_prop_filename = '';
         //如果上图片
         if (isset($config['is_image']) && $config['is_image'] || isset($config['large']) || isset($config['thumb'])) {
             $pic_filename = $md5 . '.jpg';
             $image = Helper_Image::createFromFile($file->filepath(), $file->extname());
             // 生成大图
             if (isset($config['large'])) {
                 list($w, $h) = explode('*', $config['large']);
                 $image->crop($w, $h);
             }
             $image->saveAsJpeg($dest_dir . DS . $pic_filename);
             $_prop_filename = "{$date}/{$pic_filename}";
             // 生成缩略图
             if (isset($config['thumb'])) {
                 $thumb_filename = $md5 . '-thumb.jpg';
                 list($w, $h) = explode('*', $config['thumb']);
                 $image->crop($w, $h);
                 $image->saveAsJpeg($dest_dir . DS . $thumb_filename);
             }
             // 销毁图片资源并删除上传文件
             $image->destroy();
             $file->unlink();
         } else {
             $file_name = $md5 . '.' . $extname;
             $file->move($dest_dir . DS . $file_name);
             $_prop_filename = "{$date}/{$file_name}";
         }
         //如果是更新,删除原有的
         if ($obj->id() && !empty($obj->{$file_id})) {
             $this->_delete_upload_file($obj, $file_id);
         }
         //向属性负值
         $obj->{$file_id} = $_prop_filename;
     }
     if (!empty($error)) {
         throw new QDB_ActiveRecord_ValidateFailedException($error, $obj);
     }
 }