<h4>form文件上傳</h4> <form action="/file_put/" method="post" enctype="multipart/form-data"> {% csrf_token %} 姓名<input type="text" name="user"> 文件<input type="file" name="file_obj"> <input type="submit"> </form>
path('file_put/', views.file_put),
def file_put(request): print(request.POST) #<QueryDict: {'csrfmiddlewaretoken': ['Cng1EW8TV1sbsknKXTQfsJHeGkvStPI33d9KNBkkur39tsuG68xROGmyZ9hZkcap'], 'user': ['lilz']}> print(request.FILES) #<MultiValueDict: {'file_obj': [<InMemoryUploadedFile: 1.doc (application/msword)>]}> file_obj=request.FILES.get('file_obj') #獲取到文件對象 # 文件對象有一個name屬性,獲取文件名稱字符串 print(file_obj.name) path=file_obj.name #文件名 from homework import settings #setting文件中有絕對路徑 import os path=os.path.join(settings.BASE_DIR,"files","img",path) #拼文件名的路徑 with open(path,"wb") as f: #寫入文件 for line in file_obj: f.write(line) return HttpResponse('ok')
服務端和form表單的形式同樣,不變html
客戶端瀏覽器:ajax
<h4>4 Ajax形式的文件上傳</h4> <div> 姓名<input type="text" id="user"> 文件<input type="file" name="file_obj" id="file"> <input type="button" class="filebtn" value="提交"> <p class="msg"></p> </div> <script> {#發送文件#} $('.filebtn').click(function () { var formdata=new FormData(); //實例化,formdata格式 //$('#file')[0].file[0]獲取文件對象 formdata.append("file_obj",$("#file")[0].files[0]); formdata.append("user",$("#user").val()); $.ajax({ url:'/file_put/', type:'post', data:formdata, //ajax 上傳文件必備參數 processData: false , // 不處理數據 contentType: false, // 不設置內容類型 success:function (response) { console.log(response) if (response=="ok"){ $(".msg").html("提交成功!") } } }) });
######################------------processData---------################ processData:聲明當前的data數據是否進行轉碼或預處理,默認爲true,即預處理;if爲false, 那麼對data:{a:1,b:2}會調用json對象的toString()方法,即{a:1,b:2}.toString() ,最後獲得一個[object,Object]形式的結果。 ######################------------contentType---------################ contentType:默認值: "application/x-www-form-urlencoded"。發送信息至服務器時內容編碼類型。 用來指明當前請求的數據編碼格式;urlencoded:?a=1&b=2;若是想以其餘方式提交數據, 好比contentType:"application/json",即向服務器發送一個json字符串: $.ajax("/ajax_get",{ data:JSON.stringify({ a:22, b:33 }), contentType:"application/json", type:"POST", }); //{a: 22, b: 33} 注意:contentType:"application/json"一旦設定,data必須是json字符串,不能是json對象
views.py: json.loads(request.body.decode("utf8")) ######################------------traditional---------################ traditional:通常是咱們的data數據有數組時會用到 :data:{a:22,b:33,c:["x","y"]}, traditional爲false會對數據進行深層次迭代;
效果:json
補充:數組
print(request.body) # 原始的請求體數據 print(request.GET) # GET請求數據 print(request.POST) # POST請求數據 print(request.FILES) # 上傳的文件數據