zoukankan      html  css  js  c++  java
  • django-上传文件 fromdata(头像实例)

    上传文件头像的2种方法,简单实例来看下用法

      用法定义,fromdata可以传输任何数据

    1 HttpRequest.FILES
    2 
    3   一个类似于字典的对象,包含所有的上传文件信息。
    4    FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。
    5 
    6   注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会
    7    包含数据。否则,FILES 将为一个空的类似于字典的对象。

    创建 dango app01项目 没有数据库

      1. urls 代码如下

    1 urlpatterns = [
    2     url(r'^admin/', admin.site.urls),
    3     url(r'^index/', views.index), 通过from表单提交文件头像
    4     url(r'^indexAjax/', views.indexAjax),  通过fromdata提交文件头像
    5 ]

      2. views 代码如下

     1 from django.shortcuts import render,HttpResponse
     2 
     3 # Create your views here.
     4 
     5 
     6 
     7 def index(request):
     8     '''
     9     通过from表单提交文件
    10     :param request: 
    11     :return: 
    12     '''
    13     if request.method == 'POST':
    14 
    15         # print(request.body)
    16         # print(request.POST) # <QueryDict: {'csrfmiddlewaretoken': ['2Fq1vmv59yRSUxDwlkym3qmk5bNpfdHLGzbTgveW5sdjPvTvRsuXRv6IQc7yENBN'], 'user': ['yuan'], 'cFile': ['day76.txt']}>
    17         print(request.FILES)  # <MultiValueDict: {'cFile': [<InMemoryUploadedFile: qq.png (image/png)>]}>
    18 
    19         # 拿到文件对象
    20         file_obj=request.FILES.get("cFile")
    21         print(type(file_obj)) # 这个图片对象  <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
    22 
    23         # 文件名字
    24         name=file_obj.name  文件对象自带属性
    25         print(name)  # day76.txt
    26 
    27         # 保存在本地
    28         import os
    29         from filePut import settings
    30         path=os.path.join(settings.BASE_DIR,"app01","static",name)
    31         with open(path,"wb") as f_write:
    32             for line in file_obj:
    33                 f_write.write(line)
    34         return HttpResponse(name)
    35     return render(request,"index.html")
    36 
    37 
    38 def indexAjax(request):
    39     '''
    40     通过ajax上传文件
    41     :param request: 
    42     :return: 
    43     '''
    44     if request.is_ajax() or request.method == 'POST':
    45         # print(request.body)
    46         # print(request.GET)
    47         #
    48         # print(request.POST)
    49         # print(request.FILES)
    50         # 拿到文件对象
    51         file_obj=request.FILES.get("cFile")
    52         print(file_obj)
    53 
    54         # 文件名字
    55         name = file_obj.name  对象自带属性
    56         print(name)  # day76.txt
    57 
    58         # 保存本地
    59         import os
    60 
    61         from filePut import settings
    62         path=os.path.join(settings.BASE_DIR,"app01","static",name)
    63         with open(path,"wb") as f_write:
    64             for line in file_obj:
    65                 f_write.write(line)
    66         return HttpResponse(name)
    67     return render(request,'index.html')

      3. 前端代码如下

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6     <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js "></script>
     7 </head>
     8 <body>
     9 
    10 {# from提交文件 #}
    11 {#enctype="multipart/form-data">#} 关键 ############ 没有这句话,相当于提交的是k,value字符串
    12 
    13 {#<form action="/index/" method="post" enctype="multipart/form-data">#}
    14 {#     {% csrf_token %}#}
    15 {#    <p>姓名: <input type="text" name="user"></p>#}
    16 {#    <p>文件: <input type="file" name="cFile"></p>#}
    17 {#    <input type="submit">#}
    18 {#</form>#}
    19 
    20 
    21 
    22 {# ajax提交文件,注意提交不能是个按钮它会直接就会提交#}
    23 {#$formData.append#}
    24 
    25     {% csrf_token %}
    26 {#    <p>姓名: <input type="text" id="user"></p>#}
    27     <p>文件: <input type="file" id="cFile"></p>
    28     <input type="button" value="提交" id="anniu">
    29 
    30 
    31 <script>
    32     $("#anniu").click(function () {
    33         var $formData=new FormData() ;
    34 {#        $formData.append("user",$("#user").val());#}
    35         file = $("#cFile")[0].files[0];queryset == query[0](对象,input标签) == query[0].files(input标签内文件) == files[0](最新文件)
    36         $formData.append("cFile",file);
    37 
    38 
    39         $.ajax({
    40             url:"/indexAjax/",
    41             type:"POST",
    42             data:$formData,
    43             contentType:false,    // 文件类型不错处理 ###########################注意
    44             processData:false,    // 不对数据做预处理,不进行任何编发 声明当前的data数据是否进行转码或预处理,默认为true,即预处理 #############注意
    45             headers:{"X-CSRFToken":$('[name="csrfmiddlewaretoken"]').val()},
    46             success:function (data) {
    47                 console.log(data)
    48             }
    49         })
    50 
    51     })
    52 </script>
    53 
    54 </body>
    55 </html>

    通过注册,来看看ajax fromdata用法,还有就是预览头像方法

      1. 定义盒子,选择文件头像

     1 {#                头像#}
     2                 <div class="form-group">
     3                     <label for="avatar">头像:</label>
     4 {#                    先定义一个存储头像的盒子#}
     5                     <div class="avatar_box">
     6 {#                        定义一个图片img#}
     7                         <img src="/static/img/default.png" alt="头像" id="avatar_img">
     8 {#                        这里需要去除验证错误的红,继承了form-group最好单写id#}
     9                         <input type="file" id="avatar_file" class="form-group">
    10 {#                        定义一个input标签上传文件#}
    11                     </div>
    12                 </div>

       2. 发生change事件的时候,就会触发拿到上传的这个文件对象,等待这个文件加载到input框后,将这个选中文件路径给予img 的 src 来实现预览

     1 {#    头像预览#}
     2     $('#avatar_file').change(function () {
     3         console.log('1111');
     4 {#        上传文件对象#}
     5        var file = $(this)[0].files[0];
     6 {#       读取文件的url#}
     7         console.log(file);
     8        var reader = new FileReader();
     9        reader.readAsDataURL(file);
    10 {#       阅读完全后触发事件#}
    11        reader.onload = function () {
    12 {#           预览头像就是给头像一个源文件#}
    13            console.log(this.result);
    14 {#           读取的URL结果 this.result#}
    15            $('#avatar_img').attr('src',this.result)
    16        }
    17     });

       

      总结出一点,就是无论文件还是图片,通过input类型file传,这时候拿到对象   var file_obj = $(this)[0].files[0];

      2. ajax 提交 fromdata 实现注册

     1 {#    AJAX提交注册表单,注册用户 #}
     2     $(".regBtn").click(function () {
     3 
     4         var $formData = new FormData(); #  FormData 实例 封装成的字典
     5 
     6         $formData.append('user',$('#id_user').val());
     7         $formData.append('pwd',$('#id_pwd').val());
     8         $formData.append('repeat_pwd',$('#id_repeat_pwd').val());
     9         $formData.append('email',$('#id_email').val());
    10         $formData.append('valid_code',$('#id_valid_code').val());
    11         var file = $('#avatar_file')[0].files[0];
    12         $formData.append('valid_img',file);
    13         $formData.append('csrfmiddlewaretoken',$("[name='csrfmiddlewaretoken']").val());
    14 
    15         $.ajax({
    16             url: "/register/",
    17             type: "POST",
    18             data: $formData,     // 将封装的数据打包传送到前端
    19             processData:false,   // 不做转码或预处理
    20             contentType:false,   // 文件类型不做处理
    21             success: function (data) {
    22                 if (data.user) {
    23                     location.href = '/login/'
    24                 }
    25                 else {
    26                     $('span').html('');
    27                     $(".form-group").removeClass("has-error");
    28                     console.log(data.errors);
    29 
    30                     $.each(data.errors,function (i,j) {
    31                         $("#id_" + i).next().addClass('pull-right').css('color', 'red').html(j[0]).parent().addClass('has-error');
    32                         if(i == "__all__") {
    33                             $("#id_repeat_pwd").next().addClass("pull-right").css("color", "red").html(j[0]).parent().addClass("has-error");
    34                             $("#id_pwd").parent().addClass("has-error");
    35                         }
    36                     })
    37                 }
    38             }
    39         })
    40     })
  • 相关阅读:
    Rotation Kinematics
    离职 mark
    PnP 问题方程怎么列?
    DSO windowed optimization 代码 (4)
    Adjoint of SE(3)
    IMU 预积分推导
    DSO windowed optimization 代码 (3)
    DSO windowed optimization 代码 (2)
    OKVIS 代码框架
    DSO windowed optimization 代码 (1)
  • 原文地址:https://www.cnblogs.com/jokerbj/p/8135590.html
Copyright © 2011-2022 走看看