本帖最后由 Eason_____________ 于 2013-07-25 16:41:04 编辑

解决方案 »

  1.   


    //uploadImage.php
    <?php
    /**
     * 
     * 图片上传类
     * @author ChenYue
     *
     * @param $mageStauts                 图片上传状态 1为正常状态
     * @param $iamgePath                  图片上传成功保存在数据库的路径
     * @param $imagePathTemp              临时保存图片上传成功保存在数据库的路径
     * @param $destination_folder        上传文件路径
     * @param $imageName                  上传的图片名(可自定义)
     * @param $fileArray                  上传的图片信息数组
     * @param $updateImage                判断是否更新原有图片 0表示不更新 , 1 表示更新
     * @param $uptypes                    支持上传的图片类型
     * @param max_file_size               支持上传的图片最大类型
     * @param imageType                   图片的类型
     * 
    */
    class uploadImage{

    public $imageStauts = 1;
    public $iamgePath=''; 
    private $imagePathTemp = "";
    private $destination_folder; 
    private $imageName; 
    private $fileArray;
    private $updateImage = 0; 
    private $uptypes = array(
        'image/jpg',
        'image/jpeg',
        'image/png',
        'image/x-png');    private $imageType = array('jpg','jpeg','png');
    const max_file_size=2000000;     
    /**
     * 构造函数
     * @param $file 上传的图片信息数组
     * @param $destination 上传文件路径
     * @param $name 上传的图片名(可自定义)没定义,上传后的图片名为time()
     * @param $dbPath 图片上传成功保存在数据库的路径
     * @param $update 判断是否更新原有图片 0表示不更新 , 1 表示更新 。 更新会把已经存在的图片替换掉
    */
    function __construct($file,$destination="",$name="",$dbPath="",$update=0){

    if(is_array($file) && count($file)>0 && !empty($destination)){
    $this->fileArray = $file;
    $this->destination_folder = $destination;
    $this->imageName = $name;
    $this->imagePathTemp = $dbPath;
    $this->updateImage = $update;

    }else{

    $this->imageStauts =  '初始化失败'; }

    }
    /**
     * 开始图片上传
    */
    function imageStart(){
    if($this->imageStauts === 1){
    $this->imageCheck();

    }
    if($this->imageStauts === 1){
    $this->doWork();
    }
    }
    /**

    * 图片的检查工作
    */
    function imageCheck(){
    $file = $this->fileArray;
    //print_r($file);
    if(!is_uploaded_file($file['tmp_name']) && $this->imageStauts === 1){
    $this->imageStauts =   '图片不存在!';
             
    } if(uploadImage::max_file_size < $file['size'] && $this->imageStauts === 1){
    $this->imageStauts =  '文件太大';
    }
                    /*
    //检查mime-type
    if(!in_array(strtolower($file['type']), $this->uptypes) && $this->imageStauts === 1){
    $this->imageStauts =  '不支持 '.$file['type'].' 类型的文件';
    }
                    */
    //防止在图片元数据的Comment字段中加入了php代码
    //通过二进制匹配检查
    $fileInfo = pathinfo($this->fileArray['name']);
    $fileType = strtolower($fileInfo['extension']);
    if(!in_array($fileType, $this->imageType) && $this->imageStauts === 1){
    $this->imageStauts =  '不支持 '.$fileType.' 类型的文件';
    }
                    
    if(!file_exists($this->destination_folder) && $this->imageStauts === 1){
    mkdir($this->destination_folder,0777);//设置文件权限
    }
    }
    /**
     * 
     * 开始图片上传的工作
    */
    function doWork(){ $fileName = $this->fileArray['tmp_name'];
    $fileSize = getimagesize($fileName);
    $fileInfo = pathinfo($this->fileArray['name']);
    $fileType = strtolower($fileInfo['extension']);
    $n = !empty($this->imageName) ? $this->imageName : time();
    $destination = $this->destination_folder.$n.'.'.$fileType;//图片本地路径
    $this->imagePathTemp = $this->imagePathTemp.$n.'.'.$fileType;//将要保存在数据库的路径 //上传图片,若图片存在不更新已有图片
    if(file_exists($destination) && $this->imageStauts === 1 && $this->updateImage == 0){
    $this->imageStauts =  '图片已存在';
    } //上传图片,若图片存在更新已有图片
    if($this->imageStauts === 1 && $this->updateImage == 1){
    $deleteIMageDestination = $this->destination_folder.$n; //图片保存本地路径,包含文件名,但不包含图片后缀名
    if($this->deleteImage($deleteIMageDestination)){ }else{
    $this->imageStauts = '删除已存在图片失败';
    }
    } if(!move_uploaded_file($fileName, $destination) && $this->imageStauts === 1){
    $this->imageStauts =  '传输错误';
    } if($this->imageStauts === 1){
    $this->iamgePath = $this->imagePathTemp;
    return $this->imageStauts;
    }

    } /**
     * 删除图片
     * @param $path  图片在本地的保存路径
     * @return 成功返回1 失败返回0
    */
    function deleteImage($path){
    if(!empty($path)){
    foreach($this->imageType as $type){
    $_path = $path.'.'.$type;
    if(file_exists($_path)){
    //echo $_path;
    if(!unlink($_path)){
    $this->imageStauts = '删除已存在图片失败';
    return 0;
    }
    } }
    return 1;
    }else{
    $this->imageStauts = '待删除图片路径不能为空';
    return 0;
    }
    }}?>
      

  2.   


    现在图片能上传了,也能写入数据库了。 就是 如果有文件和图片一起上传的话。
    就获取不到$_GET的值
      

  3.   


    是类有问题吗? 
    现在的过程是:
    如果值上传文字的话, 就直接插入数据库。
    如果上传了有文字图片的话,等图片上传完成然后在执行插入数据库的操作。if($i->imageStauts == 1) 这个是判断图片是否上传完成的
      

  4.   

    先确认代码是否走到了这个if块中,如果都没到这个块中,你怎么知道get的值没取到呢?
    if($i->imageStauts == 1){
        echo "aaaaaa";
    }还有,你的代码跟之前的不大一样的。
    $i->doWork();
    $i->imageCheck();
    这些逻辑不要了?
      

  5.   


    $i->imageStart();
    替代了:
    $i->doWork();
    $i->imageCheck();
    if($i->imageStauts == 1)
    能走
    都能插入数据库。 
    图片地址,都能插入数据库,就是get获取的值 不能插入到数据库,
      

  6.   

    一个低级错误
    if($i->imageStauts == 1)
    是Status
      

  7.   

    public $imageStauts = 1;我类里面也是这样写的
      

  8.   

    public $imageStauts = 1;我类里面也是这样写的
      

  9.   


    就是找不到原因,如果上传图片 始终都获取不到get的值  不上传图片就行。。
      

  10.   

    public $imageStauts = 1;我类里面也是这样写的
    ...是看走眼了。。
      

  11.   


    如果不加这个判断 if($i->imageStauts == 1)  就能得到get值
      

  12.   

    加上调试:
    else{
        echo "to else";
        if($i->imageStauts == 1){
            echo "to status";
            $sql="insert into json_bbs values('','".$gettitle."','".$getcontent."','','".time()."','')";
            mysql_query($sql);
        }
    }然后看看是哪块的问题。
      

  13.   


    如果不加这个判断 if($i->imageStauts == 1)  就能得到get值那不是没得到值,而是imageStauts不等于1,根本就没有走到这个代码块。
      

  14.   


    如果不加这个判断 if($i->imageStauts == 1)  就能得到get值那不是没得到值,而是imageStauts不等于1,根本就没有走到这个代码块。但是我把  $sql="insert into json_bbs values('','".$gettitle."','".$getcontent."','','".time()."','')"; 加红的地方换成 随便什么字符  就能插入到数据库
      

  15.   

    if($i->imageStauts == 1) 这一步是通过了的。这个是取消了get值  随便输入的字符:这个是取的get值
      

  16.   


    如果不加这个判断 if($i->imageStauts == 1)  就能得到get值那不是没得到值,而是imageStauts不等于1,根本就没有走到这个代码块。但是我把  $sql="insert into json_bbs values('','".$gettitle."','".$getcontent."','','".time()."','')"; 加红的地方换成 随便什么字符  就能插入到数据库
    先把调试代码加上,sql也echo出来,看看结果。
      

  17.   

    就是说图片还是可以上传的了,对吧?你的文字和图片是分别上传的,所以你的接收程序被执行了两次
    一次是只有 get 过来的文字数据
    一次是只有 upload 过来的图片
    你需要做到的是:能识别这两次数据是来自同一浏览器的同一次提交(看代码图片是在提交的时候选择的,对吧?)
    嗯,你的  uexUploaderMgr.createUploader(1,uploadHttp); 放错位置了,原来是对的为了识别是来自同一浏览器,你可以使用 cookie 最好是 session 方便记录状态
    为了识别是来自同一次提交,你可以在 url 上附加序号
    大致是这个样子
    var uploadHttp = "http://localhost/json/bbs/index.php";
    var num = 0;
    function upload(){
      var url = uploadHttp + '?t=' + num; 
      if($$("fb-title").value!='' && $$("fb-content").value!='' && document.getElementById("showPic").src==""){
        uexUploaderMgr.createUploader(1,url);
        var fbtitle = $$("fb-title").value;
        var fbcontent = $$("fb-content").value;
        url += '&title='+fbtitle+'&content='+fbcontent+"&imgshows=none";
        $.getJSON(url,function(data){
          });
    ....
    session_start();
    if(isset($_SESSION['t']) && $_SESSION['t'] == $_GET['t']) {
      //同一次提交
      //根据传入的数据,修改数据库
    }else {
      $_SESSION['t'] = $_GET['t'];
      //根据传入的数据,插入数据库
      $_SESSION['last'] = 上一次插入的 id ,用作修改是的凭据
    }
      

  18.   


    这样子不行,图片和文字 是一起上传的  
    if($$("fb-title").value!='' && $$("fb-content").value!='' && document.getElementById("showPic").src=="")//这个是判断有没有图片 这个是没有图片 直接就插入数据库了
    if($$("fb-title").value!='' && $$("fb-content").value!='' && document.getElementById("showPic").src!="")//这个是有图片的 有图片 就执行上传图片的操作。执行了图片的操作后,
    if($i->imageStauts == 1) 判断图片是否是完成了上传。如果完成了上传,就把文字和图片一起插入数据库,不是分开执行的。现在就是 if($i->imageStauts == 1){ 在这里面不能获取GET的值。 如果把 $_GET['title']换成随便什么字符都行}
      

  19.   

    要怎么说你才能明白是分两次上传的呢?
    这是上传文字,get方式,不可能上传文件。上传文件至少需要是post方式
    $.getJSON(url,function(data){
     
    这是创建一个上传组件,没有表单只能用组件上传
    uexUploaderMgr.createUploader(1,uploadHttp);