zoukankan      html  css  js  c++  java
  • 图片预览

    应用:

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


    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})
    后台处理
  • 相关阅读:
    栈· 用一个栈实现另一个栈的排序
    Array+DP leetcode-11.装更多的水
    string+DP leetcode-4.最长回文子串
    leetcode-3 最长无重复字串
    栈 · 有getMin功能的栈O(1)
    VS OpenCV imread imwrite nameWindow等相关报错问题
    socket字符流循环截取
    jsp:set/getProperty底层实现的探究
    关于C++11右值引用和移动语义的探究
    VS fopen sprinft ... unsafe 问题
  • 原文地址:https://www.cnblogs.com/liuguniang/p/7232984.html
Copyright © 2011-2022 走看看