使用ajaxfileupload插件实现异步上传并保存图片功能

使用jquery插件ajaxfileupload.js可以实现页面无刷新上传图片文件,后台管理有关图片的上传功能可以利用它,很方便

一、目标效果:
1.前端,页面上传多张图片时,POST到服务器端,页面能立即显示图片效果,并且不刷新页面
2.后台,页面POST过来的图片被重命名并保存到服务器

二、思路:
1.封装一个js函数uploadimg(imgid,fileid,hiddenid),里面调用ajaxfileupload.js的函数$.ajaxFileUpload()将标签input type=’file’ 里的文件ajax方式上传到服务器,上传成功后接收返回json数据——图片在服务器端的路径data.path,将该值赋给img标签和对应的隐藏域
2.在服务器端有个专门处理ajax上传图片的php文件,首先判断文件类型和大小是否合法,然后将文件重命名并且移动一个文件暂存区,然后json格式返回图片路径给前端页面
3.等到页面真正提交表单信息到后台保存时,后台根据隐藏域中的图片路径值,将暂存区中的图片移动到真正永久保存图片的文件夹中

三、代码:
1.前端:
①html页面:

<html lang="en-US">
<head>
    <meta charset="UTF-8"/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rel=‘stylesheet‘ type="text/css" href=‘/assets/css/own/img.css‘ />
    <script src="/assets/js/jquery-1.4.2.min.js"></script>
    <script src="/assets/js/ajaxfileupload.js"></script>
    <script src="/assets/js/own/uploadimg.js"></script>
    <title>upload image</title>
</head>
<body>
    <form id="w0" action="imgfile.php" name="form1" method="post" enctype="multipart/form-data" >
    <div> 
        <input type="file" name="fileImg" id="fileImg" onchange="uploadimg(‘img1‘,‘fileImg‘,‘hidden1‘)" accept="image/jpeg,image/png,image/gif"><br />  
        <input type="hidden" name="hidden1" value="" />
        <img class="load0" name="img1" id="img1" src="" />
    </div>
    <br /><br />
    <div> 
        <input type="file" name="fileImg2" id="fileImg2" onchange="uploadimg(‘img2‘,‘fileImg2‘,‘hidden2‘)" accept="image/jpeg,image/png,image/gif"><br />  
        <input type="hidden" name="hidden2" id="hidden2" value="" />
        <img class="load0" name="img2" id="img2" src="" />
    </div>
    <br /><br />
    <input type="submit" value="ok">
    </form>
</body>
</html>

②uploadimg.js代码,这里面调用了ajaxfileupload.js的函数来实现ajax图片文件上传,以及接收返回值后控制前端页面显示

 function uploadimg(imgid,fileid,hiddenid) {
 //imgid指<img />标签id,fileid表示<input type=‘file‘ />文件上传标签的id,hiddenid指隐藏域标签id
    $("#"+imgid).attr("src","/assets/img/loading/load.gif").removeClass("load0");//加载loading图片
    $.ajaxFileUpload
    (
        {            
            url: ‘http://127.0.0.1/common/upImgfile.php‘,
            secureuri: false,
            fileElementId: fileid,  
            dataType: ‘json‘,              
            success: function (data, status)
            {   //data的内容都是在后台php代码中自定义的,json格式返回后在这里以对象的方式的访问
                if(typeof (data.error) != ‘undefined‘){//上传文件出错
                  var error_msg="";
                  switch(data.error)
                  {
                    case "101": error_msg="文件类型错误";
                        break;
                    case "102": error_msg="文件过大";
                        break;
                    case "400": error_msg="非法上传";
                        break;
                    case "404": error_msg="文件为空";
                        break;
                    default :error_msg="服务器不稳定";
                  }
                  alert(error_msg);
                }else{
                    $("#"+imgid).attr("src",data.path).addClass("load1");//加载返回的图片路径并附加上样式
                    $("#"+hiddenid).val(data.path);//给对应的隐藏域赋值,以便提交时给后台
                }               
            },
            error: function (data, status, e)
            {
                alert(e);
            }
        }
    )
}

2.后台:
upImgfile.php代码:

<?php
//接收POST方式上传的文件,存放到临时文件夹

if(isset($_FILES)&&(!empty($_FILES))){
    foreach($_FILES as $el)//获取文件,这里默认都是每次都单文件上传
    {
        $file=$el;
    }
    if(is_uploaded_file($file["tmp_name"])){//确认是POST方式上传的文件
        $cache_path="../assets/uploads/cache/";//暂存文件的目录
        $fname=$file["name"];//获取文件名
        $ftype=$file["type"];//获取文件类型
        $ftmp_name=$file["tmp_name"];//获取临时文件路径
        $fsize=$file["size"];//获取文件大小
        $ferror=$file["error"];//获取文件错误代号

        //判断文件大小是否符合规则
        if(!check_size($fsize)){
            echo json_encode(array("error"=>"102"));//102错误码代表文件过大
            exit;
        }

        $suffix=strtolower(stristr($fname, "."));//获取文件后缀名(包含了点号),并后缀名小写化
        //判断文件类型是否为图片
        if(!is_img($suffix)){
            //如果不是图片类型,直接返回error为101,代表文件类型错误
            echo json_encode(array("error"=>"101"));
            exit;
        }

        $uniqStr=uniqid(strtotime("now")."_".mt_rand(100000,999999)."_");//创建随机ID
        $fname_new = $cache_path.$uniqStr.$suffix;//利用当前时间戳构造新的文件名称      
        move_uploaded_file($ftmp_name, $fname_new);//将临时文件区的文件移动到暂存区中  
        $fname_new=stristr($fname_new,"/");
        echo json_encode(array("path"=>$fname_new));//返回文件路径给看、客户端 
    }else{  
            echo json_encode(array("error"=>"400"));//400错误码代表文件非法上传(不是httppost提交)
    }

}else{
    echo json_encode(array("error"=>"404"));//404错误码代表文件为空
}


/**
*判断文件后缀是否是图片
*@param string $suffix :带点的后缀名(如.jpg)
*@return bool 如果是图片后缀名返回true,否则返回false
*/
function is_img($suffix){
    $suffix_arr=array(‘.jpg‘,‘.png‘,‘.gif‘,‘.jpeg‘,‘.bmp‘);    
    return in_array(strtolower($suffix), $suffix_arr);
}

/**
*判断文件大小是否非法
*@param int $size :单位为byte的整数,文件大小
*@return bool 如果文件大小小于或等于规定的最大值返回true,否则返回false
*/
function check_size($size){    
    $postMaxSize=intval(ini_get("post_max_size"));//post文件最大值
    $uploadMaxFilesize = intval(ini_get("upload_max_filesize"));//upload上传文件最大值
    $max=min($postMaxSize,$uploadMaxFilesize) *1024*1024;//将MB转换为byte单位数据
    if(intval($size)<=$max){
        return true;
    }else{
        return false;
    }
}

四、效果图
技术分享

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。