3种上传图片并实现预览的方法

在常见的用户注册页面,需要用户在本地选择一张图片作为头像,并同时预览

常见的思路有两种:一是将图片上传至服务器的临时文件夹中,并返回该图片的url,然后渲染在html页面;另一种思路是,直接在本地内存中预览图片,用户确认提交后再上传至服务器保存

这两种方法各有利弊,方法一很明显,浪费流量和服务器资源;方法二则加重了浏览器的负担,并且对浏览器的兼容性要求更高()

以下是实现上述思路的方法:

1、模板文件

<!DOCTYPE html>
<html lang="en">
<head>
          <meta charset="UTF-8">
          <title>Title</title>
</head>
<body>
           <div style="margin-left:30px;margin-top:30px">
                <form action="">
                    {% csrf_token %}
                  <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/images/sample.png" name="avatar" style="width:400px">{#实际应用中要将该input标签隐藏,display:none;#}
               <p><input type="submit" value="注册"></p>
                 </form>
               <div style="position:absolute;top:85px;left:300px;">
               <input id="avatarSlect" type="file" style="position:absolute;float:left;z-index:10;opacity:0;width:100px;height:100px;">
                <img id="avatarPreview" src="/static/images/sample.png" title="点击更换图片"
style="position:absolute;z-index:9;float:width:100px;height:100px">
</div>
</div>
</body>
</script src="/static/jquery-3.2.1.js"></script>
<script>
         $(function(){
                    bindAvatar();
});
function bindAvatar(){
               if(window.URL.createObjectURL){
                  bindAvatar3();
               }else if(window.FileReader){
                        bindAvatar2();
               }
                  else{
                           bindAvatar1();
}
}
/*Ajax上传至后台并返回图片的url*/
function bindAvatar1(){
        $("#avatarSlect").change(function(){
        var csrf=$("input[name='csrfmiddlewaretoken']").val();
        var formData=new FormData();
        formData.append("csrfmiddlewaretoken",csrf);
        formData.append('avatar',$("#avatarSlect")[0].files[0]);/*获取上传的图片对象*/
        $.ajax({
                     url:'/upload_avator/',
                     type:'POST',
                     data:formData,
                     contentType:false,
                     processData:false,
                     success:function(args){
                    console.log(args);/*服务器端的图片地址*/
                       $("#avatarPreview").attr('src','/'+args);/*预览图片*/
                       $("#avatar").val('/'+args);/*将服务端的图片url赋值给form表单的隐藏input标签*/
       }
                })
})
}
/*window.FileReader本地预览*/
function bindAvatar2(){
         console.log(2);
             $("#avatarSlect").change(function(){
                  var obj=$("avatarSlect")[0].files[0];
                  var wuc=window.URL.createObjectURL(obj);
                   $("#avatarPreview").attr('src',wuc);
                   $("#avatar").val(wuc);
                   {#                     $("#avatarPreview").load(function () {#}        /*当图片加载后释放内存空间,但在jQuery3.2.1中会报错。浏览器关闭后也会自动释放*/
{#                             window.URL.revokeObjectURL(wuc);#}
{#           })#}
      })
  }

</script>
</html>

2、视图函数

from django.shortcuts import render,HttpResponse
 def test(request):
return render(request,'test.html')
def upload_avatar(request):
        file_obj=request.FILES.get('avatar')
        file_path=os.path.join('static/images',file_obj.name)
        with open(file_path,'wb') as f:
          for chunk in file_obj.chunks();
                 f.write(chunk)
         return HttpResponse(file_path)

3、路由系统

from django.conf.urls import url
from django.contrib import admin
from home import views as homeViews

urlpatterns=[
          url(r'^admin/'admin.site.urls),
          url(r'^upload_avatar/',homeViews.upload_avatar),  #上传头像
          url(r'^test/',homeViews.test),   #测试页面
]

 

posted @ 2017-08-01 17:01  维尼熊320  阅读(311)  评论(0编辑  收藏  举报