一:form表单标签的文件上传
1: 浏览器:
html文件
1<h4>form文件上传</h4> 2<form action="/file_put/" method="post" enctype="multipart/form-data"> 3 {% csrf_token %} 4 姓名<input type="text" name="user"> 5 文件<input type="file" name="file_obj"> 6 <input type="submit"> 7</form>
2:服务端:
urls.py
path('file_put/', views.file_put),
views.py
1def file_put(request): 2 print(request.POST) #<QueryDict: {'csrfmiddlewaretoken': ['Cng1EW8TV1sbsknKXTQfsJHeGkvStPI33d9KNBkkur39tsuG68xROGmyZ9hZkcap'], 'user': ['lilz']}> 3 print(request.FILES) #<MultiValueDict: {'file_obj': [<InMemoryUploadedFile: 1.doc (application/msword)>]}> 4 file_obj=request.FILES.get('file_obj') #获取到文件对象 5 6 # 文件对象有一个name属性,获取文件名称字符串 7 print(file_obj.name) 8 path=file_obj.name #文件名 9 10 from homework import settings #setting文件中有绝对路径 11 import os 12 path=os.path.join(settings.BASE_DIR,"files","img",path) #拼文件名的路径 13 with open(path,"wb") as f: #写入文件 14 for line in file_obj: 15 f.write(line) 16 17 return HttpResponse('ok')
效果:


二:ajax文件上传
服务端和form表单的形式一样,不变
客户端浏览器:
1<h4>4 Ajax形式的文件上传</h4> 2 3<div> 4 姓名<input type="text" id="user"> 5 文件<input type="file" name="file_obj" id="file"> 6 <input type="button" class="filebtn" value="提交"> 7 <p class="msg"></p> 8</div> 9 10 11<script> 12 {#发送文件#} 13 $('.filebtn').click(function () { 14 var formdata=new FormData(); //实例化,formdata格式 15 //$('#file')[0].file[0]获取文件对象 16 formdata.append("file_obj",$("#file")[0].files[0]); 17 formdata.append("user",$("#user").val()); 18 19 $.ajax({ 20 url:'/file_put/', 21 type:'post', 22 data:formdata, 23 24 //ajax 上传文件必备参数 25 processData: false , // 不处理数据 26 contentType: false, // 不设置内容类型 27 success:function (response) { 28 console.log(response) 29 if (response=="ok"){ 30 $(".msg").html("提交成功!") 31 } 32 } 33 }) 34 }); 35 36######################------------processData---------################ 37 38processData:声明当前的data数据是否进行转码或预处理,默认为true,即预处理;if为false, 39 那么对data:{a:1,b:2}会调用json对象的toString()方法,即{a:1,b:2}.toString() 40 ,最后得到一个[object,Object]形式的结果。 41 42######################------------contentType---------################ 43 44contentType:默认值: "application/x-www-form-urlencoded"。发送信息至服务器时内容编码类型。 45 用来指明当前请求的数据编码格式;urlencoded:?a=1&b=2;如果想以其他方式提交数据, 46 比如contentType:"application/json",即向服务器发送一个json字符串: 47 $.ajax("/ajax_get",{ 48 49 data:JSON.stringify({ 50 a:22, 51 b:33 52 }), 53 contentType:"application/json", 54 type:"POST", 55 56 }); //{a: 22, b: 33} 57 58 注意:contentType:"application/json"一旦设定,data必须是json字符串,不能是json对象 views.py: json.loads(request.body.decode("utf8")) 59 60 61######################------------traditional---------################ 62 63traditional:一般是我们的data数据有数组时会用到 :data:{a:22,b:33,c:["x","y"]}, 64 traditional为false会对数据进行深层次迭代;
效果:


补充:
1print(request.body) # 原始的请求体数据 2print(request.GET) # GET请求数据 3print(request.POST) # POST请求数据 4print(request.FILES) # 上传的文件数据