图片预览

应用:

登录注册时头像的图片预览:


1 伪ajax 提交文件,后台接收后返回文件路径,伪ajax更新src 提供预览,第二次提交数据时,提交头像的路径。小bug是后台必须临时保存上传的头像文件

<form  id='f1' action="/register1/"  method="post" target="ifr" enctype="multipart/form-data" novalidate>
        {% csrf_token %}
        <iframe id="ifr" name="ifr"></iframe>
        <input id='i1' type="file" onchange="uploadimg()" name="avator">
        <img id='avator' src="/static/img/avatar.png">
    </form>


 //伪ajax上传文件
    function uploadimg(){
        document.getElementById('f1').submit();
        document.getElementById('ifr').onload=ShowImg;
    }
    function ShowImg(){
        var content=document.getElementById('ifr').contentWindow.document.body.innerText;
        document.getElementById('avator').src='/'+content;
        var tag=document.createElement('input');
        console.log(content);
        tag.name='avator_path';
        tag.value='/'+content;
        tag.style.display='none';
        document.getElementById('submit_form').appendChild(tag)
    }


def register1(request):
    avator_obj = request.FILES.get('avator')

    file_path = os.path.join('static', 'img', avator_obj.name)
    with open(file_path, 'wb') as f:
        for chunk in avator_obj.chunks():
            f.write(chunk)
            return HttpResponse(file_path)

 

2   原生ajax提交文件(获取CSRF)formdata ,后台接收后返回文件路径,ajax更新src 提供预览,第二次提交数据 时,提交头像的路径
3   本地上传预览,不用提交到后台,提供预览功能,在提交数据时,一起提交头像的文件数据

 

 1 <form class="form-horizontal" id='submit_form' method="post" action="/register/" novalidate enctype="multipart/form-data">
 2         {% csrf_token %}
 3         <div>
 4             <img id='avatar1' src="/static/img/avatar.png" >
 5 {#            <input type="file" id="imgselect">#}
 6             {{ obj.avator }}{{ obj.errors.avator.0 }}
 7         </div>
 8 </form>
 9 
10 
11 $(function(){
12         bindAvatar()
13     });
14 
15     function bindAvatar(){
16         if(window.URL.createObjectURL){
17             bindAvatar2();
18         }else if(window.FileReader){
19             bindAvatar3()
20         }else{
21             bindAvatar1()
22         }
23     }
24     //原生ajax上传文件
25     function bindAvatar1(){
26         $('#imgselect').change(function(){
27             var csrf=$('input[name="csrfmiddlewaretoken"]').val();
28 
29             var formdata=new FormData();
30             formdata.append('avator',$(this)[0].files[0]);
31             formdata.append("csrfmiddlewaretoken",csrf);
32 
33             var xhr=new XMLHttpRequest();
34             xhr.onreadystatechange=function () {
35                 if (xhr.readyState==4){
36                     var file_path=xhr.responseText;
37                     document.getElementById('avatar1').src='/'+file_path;
38                 }
39             };
40             xhr.open('POST','/register1/');
41             xhr.send(formdata)
42         })
43     }
44     //本地上传预览
45     function bindAvatar2() {
46         $('#imgselect').change(function(){
47             var obj=$(this)[0].files[0];
48 
49             var v=window.URL.createObjectURL(obj);
50             $('#avatar1').attr('src',v);
51             $('#avatar1').load(function () {
52                 window.URL.revokeObjectURL(v);
53             })
54         })
55     }
56 
57     function bindAvatar3(){
58         var obj=$(this)[0].files[0];
59         var reader= new FileReader();
60         reader.onload=function (e) {
61             $('#avatar1').attr('src',this.result);
62         };
63         reader.readAsDataURL(obj);
64     }
前端
 1 def register(request):
 2      if request.method=='GET':
 3          obj=registerForm(request)
 4          return render(request,'register.html',{'obj':obj})
 5 
 6      else:
 7          # 第一种方案:伪ajax提交用户头像信息
 8          # session_code = request.session.get('code')
 9          # #获取form组件生成的标签的值
10          # obj = registerForm(request.POST)
11          # #获取伪ajax生成的input标签的值(用户头像)
12          # avator_path=request.POST.get('avator_path')
13          # if obj.is_valid():
14          #     code=obj.cleaned_data.pop('code')
15          #     #判断验证码信息
16          #     if session_code.upper()==code.upper():
17          #         #向clean_data中加入一个键值对,存放用户头像信息
18          #         obj.cleaned_data['avator']=avator_path
19          #         #更新数据库
20          #         models.user.objects.create(**obj.cleaned_data)
21          #         return redirect('/')
22          #     else:
23          #         return render('register.html',{'msg': '验证码错误'})
24          # else:
25          #     return render(request, 'register.html', {'obj': obj})
26 
27 
28 
29          #第二种方案:本地预览头像,在form组件生成的标签中提交头像信息
30          obj=registerForm(request,request.POST,request.FILES)
31          if obj.is_valid():
32              obj.cleaned_data.pop('code')
33              obj.cleaned_data.pop('password2')
34              models.user.objects.create(**obj.cleaned_data)
35              return redirect('/')
36          else:
37              return render(request, 'register.html', {'obj': obj})
后台处理

 

posted @ 2017-07-25 11:12  柳姑娘  阅读(154)  评论(0编辑  收藏  举报