Django-multipart/form-data數據封裝類型---文件上傳

一:form表單標籤的文件上傳

1: 瀏覽器:

html文件

<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>

2:服務端:

urls.py

path('file_put/', views.file_put),

views.py

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')

 

效果:

 

 

二:ajax文件上傳

服務端和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)  # 上傳的文件數據
相關文章
相關標籤/搜索