ajax,form表单 上传文件

content_type --> 做数据接口,解析器的时候 会用到

content_type

1. 是前后端,跟其他项目交互的一种消息格式
2. 响应头里的格式 content_type:text/html;charset=utf-8(默认的)
3. 请求头里的格式 Content-Type: application/x-www-form-urlencoded; charset=UTF-8

django 认识 form-data数据 和 urlencoded 数据格式

django内置一种解析器原理 (urlencoded格式数据)

django解析器 会拿到请求头里的content_type 做判断
if content_type = 'application/x-www-form-urlencoded; charset=UTF-8'
      会从view sourse拿数据,数据如下
      name=root&pwd=zdd.961225&csrfmiddlewaretoken=YNhJKBb1z3heoUrxmOybCLqswYtJYWXtkNLVTch6b074apxifs8JFV8plKTMqiF6
      &符号分割处理,把数据以键值对存到request.POST里
      <QueryDict: {'name': ['root'], 'csrfmiddlewaretoken': ['YNhJKBb1z3heoUrxmOybCLqswYtJYWXtkNLVTch6b074apxifs8JFV8plKTMqiF6'], 'pwd': ['123']}>
       

content_type 上传文件

前端代码: 
<form action="{% url 'upload' %}" method="post" enctype="multipart/form-data">
  {% csrf_token %}
  <input type="file" name="head_portrait">
  <input type="submit">
</form>
后端代码:
def upload(request):

  if request.method == 'GET':
      return render(request,'upload.html')
  else:
      #request.POST拿到的是文件请求数据,request.FILES拿到的是文件数据
      # print(request.FILES)
      file_obj = request.FILES.get('head_portrait')
      print(file_obj)
      file_name = file_obj.name
      print(file_name)
      import os
      file_path = os.path.join(settings.BASE_DIR,'statics','img',file_name)
      with open(file_path,'wb')as f:
          for line in file_obj:
              f.write(line)
      return HttpResponse('OK')

ajax上传文件

<script>
  $('#btn').click(function () {
      var formdData = new FormData();
      var file = $('#file')[0].files[0];
      formdData.append('head_portrait',file);
      formdData.append('csrfmiddlewaretoken','{{ csrf_token }}');
      $.ajax({
           
          url:{% url 'upload' %},
          type:'post',
          data:formdData,
          processData:false,
          contentType:false,
          success:function (res) {
              console.log(res)
          }
           
      })
  })
</script>
后端跟上边一样

 

读文件的另一种方法

for i in file_obj.chunks(chunk_size=none):#chunks() 默认一次返回的大小为65536B,也就是64kb,最大2.5M,就是一个生成器,chunk_size 指定文件大小
     f.write(i)
posted @ 2021-04-15 12:25  苦行僧冬*婷  阅读(103)  评论(0)    收藏  举报