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)

浙公网安备 33010602011771号