zoukankan      html  css  js  c++  java
  • 文件上传

    一、form表单发送文件

    ​ form表单中必须指定enctype="multipart/form-data",使用表单上传文件时,因为form表单不支持发json类型的contenttype格式的数据

    <form action="{% url 'upload' %}" method="post" enctype="multipart/form-data" style="background-color: blanchedalmond">
        <label for="myfile" class="col-sm-2 control-label">头像</label>
        <div class="col-sm-4">
            <input type="file" class="" id="myfile" name="head_pic">
            <span class="help-block">只支持png、jpg、gif格式</span>
        </div>
        <input type="submit">
        {% csrf_token %}
    </form>
    
    '''后端'''
    def upload(request):
        if request.method =='GET':
            return redirect('test')
        else:
            '''
            request.POST只能<QueryDict: {'head_pic': ['WechatIMG59.jpeg'], 'csrfmiddlewaretoken': ['KuCMXie1V4nNYwR45cxU1CpffUKypYvh5dicQnqrq30bkKWavIt41aLlES2NtdWG']}>
            并未拿到上传的文件的数据
            '''
            print(request.POST)
            '''<MultiValueDict: {'head_pic': [<InMemoryUploadedFile: WechatIMG59.jpeg (image/jpeg)>]}>'''
            print(request.FILES)
            file_obj = request.FILES.get('head_pic')
            # WechatIMG59.jpeg
            print(file_obj)
            # 获取文件名称
            file_name = file_obj.name
            path = os.path.join(settings.BASE_DIR, 'static_file', 'img', file_name)
            with open(path, 'wb') as f:
                # 每次读取的data不是固定长度的,和读取其他文件一样,每次读一行,识别符为
      
      
    ,遇到这几个符号就算是读了一行
                for i in file_obj:
                    f.write(i)
                '''chunks()默认一次返回大小为经测试为65536B,也就是64KB,最大为2.5M,是一个生成器
                	 可以修改其大小,在global_settings配置
                '''
                # for chunks in file_obj.chunks():
                    # f.write(chunks)
            return HttpResponse('上传成功!')
    

    二、ajax发送文件

    $('#b1').click(function (){
        console.log($('#file')[0]);
        console.log($('#file')[0].files);
        console.log($('#file')[0].files[0]);
    
        {#必须实例化一个FormData对象,FormData对象可以带文件数据#}
        var formdata = new FormData()
        {#$('#file')[0]变为DOM对象,.files[0]取第一个文件对象#}
        formdata.append('head_pic', $('#file')[0].files[0]);
        formdata.append('csrfmiddlewaretoken', '{{ csrf_token }}');
        $.ajax({
            url:'{% url 'upload' %}',
            type: 'post',
            data:formdata,
            {#ajax传输文件必须加上以下两句话#}
            {#不处理数据#}
            processData:false,
            {#不设置内容类型#}
            contentType: false,
    
            success:function (res){
                console.log(res)
            }
        })
    })
    
  • 相关阅读:
    Kafka发送和接收消息
    Kafka主题topic的增删改查
    Kafka启动
    synchronize底层实现原理
    StringBuffer和StringBuilder的区别
    常见的排序算法
    Redis缓存穿透,缓存击穿,缓存雪崩原理及解决方案
    Redis持久化策略
    redis支持的数据类型
    Bytes 类型
  • 原文地址:https://www.cnblogs.com/messi-mu/p/14310703.html
Copyright © 2011-2022 走看看