python中,无论是上传头像,是啊发布图片新闻等,都需要进行图片预览,主要有两种实现逻辑:

  一、将图片传至后端服务器,服务器返回图片的url给前端,前端根据反馈的url进行显示,

  二、直接本地预览,将本地图片导入前端内存,前端从到内存中读取后显示,

  方式一,浪费服务器资源和占用带宽、流量,方式二影响前端响应且受客户端兼容性的影响,各有利弊

  将图片传至服务器后台,主要依靠ajax,这里主要说一下图片本地预览,有两种实现方式:

  1、window.FileReader

  在HTML5中,定义了FileReader作为文件API的重要成员用于读取文件,

  FileReader共有四种方法,如下:

  

  FileReader还有各事件模型,用于不同情境下触发函数:

  

  这里,进行图像预览,需要使用方法readAsDataURL,当文件读取成功时由onload触发相应处理函数,

  另外需要注意:FileReader的读取结果保存在result中,需要使用this.result获取, 

  2、window.URL.createObjectURL

  在内存中,创建一个file对象或blob对象的url对象,再根据url进行显示, 

  需要注意的是,每一次使用该方法,都会创建一个新的URL对象,即使已经用相同的对象作为参数创建过。

  当不再需要这些URL对象时,每个对象必须通过调用 URL.revokeObjectURL() 方法来释放。

  浏览器会在文档退出的时候自动释放它们,但是为了获得最佳性能和内存使用状况,应该在安全的时机主动释放掉它们。

   

$(function(){
    bindAvatar();
});

function bindAvatar() {
    if(window.URL.createObjectURL){
        bindAvatar3();
    }
    else if(window.FileReader){
        bindAvatar2();
    }
    else {
        bindAvatar1();
    }
}



///*Ajax上传至后台并返回图片的url*/
function bindAvatar1() {
    console.log('Ajax上传至后台并返回图片的url');
}

///*window.FileReader本地预览*/
function bindAvatar2() {
    console.log('window.FileReader本地预览');
    $("#avatarSlect").change(function(){
        // 获取input:file对象
        var obj = $("#avatarSlect")[0].files[0];

        // 创建FileReader对象
        var fr = new FileReader();

        // 读取成功时触发显示
        fr.onload = function(){
            $("#avatarPreview").attr("src",this.result);
            $("#avatar").val(this.result);
        };
        // 将file文件读取为dataURL,
        fr.readAsDataURL(obj);
    });
}

///*window.URL.createObjectURL本地预览*/
function bindAvatar3() {
    console.log('window.URL.createObjectURL本地预览');
    $("#avatarSlect").change(function(){
        //获取input:file文件对象(blob),包含name、size、type等信息
        var obj = $("#avatarSlect")[0].files[0];

        //根据file对象创建一个URL对象
        var wuc = window.URL.createObjectURL(obj);

        //显示图片和地址信息
        $("#avatarPreview").attr('src',wuc);
        $("#avatar").val(wuc);

//        //当图片加载完成后释放URL(jquery3.2.1中会报错),浏览器关闭后也会自动释放,
//        $("#avatarPreview").load(function({
//            window.URL.revokeObjectURL(wuc);
//        }));
    });
}
本地浏览js
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
    <script rel="stylesheet" src="static/jquery-1.12.4.min.js" ></script>
    <script rel="stylesheet" src="static/index.js"></script>
</head>
<body>
    <div>
        <form action="">
            <h3>用户注册</h3>

            <p>用户名:<input type="text" name="userName"></p>
            <p>密码:<input type="password" name="password"></p>
            <p>邮箱:<input type="text" name="email"></p>

            <input id="avatar" type="text" value="static/bu.png" name="avatar" >
            <p><input type="submit" value="注册"></p>
        </form>

        <div>
            <input id="avatarSlect" type="file" >
            <img id="avatarPreview" src="static/bu.png" title="点击更换图片" >
        </div>

    </div>
</body>
</html>
本地浏览html