Ajax上传文件(利用FormData)

Ajax上传文件(利用FormData):既可以处理二进制,又可以处理字典,列表等

FormData是什么呢?

XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttpRequest的send()方法来异步的提交这个"表单".比起普通的ajax,使用FormData的最大优点就是我们可以异步上传一个二进制文件.
所有主流浏览器的较新版本都已经支持这个对象了,比如Chrome 7+、Firefox 4+、IE 10+、Opera 12+、Safari 5+。
注意:下文中的几个需要解释的
$("#upload") 拿到的是一个集合
$("#upload")[0]  就是一个dom对象
$("#upload")[0].files   拿到的是一个filelist
$("#upload")[0].files[0]  拿到的是当前最近的文件对象 

要是使用FormData一定要加上:

一定要加上:

  contentType:false 
  processDate:false #不做预处理

ajaxupload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width">
    <title>Title</title>
</head>
<body>
<p>姓名<input type="text" name="username"></p>
<p>头像<input type="file" id="upload"></p>
<p><button class="btnnn">提交</button><span class="tishi"></span></p>
<script src="/static/jquery-3.2.1.min.js"></script>
<script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script>
<script>
    $(".btnnn").click(function () {
         var formData=new FormData();
        formData.append("username",$(":text").val());
        formData.append("file",$("#upload")[0].files[0]);
        $.ajax({
            url:"/get_upload/",
            type:"POST",
            headers:{"X-CSRFToken":$.cookie('csrftoken')},
            data:formData,
            contentType:false,
            processData:false,
            success:function (data) {
                $(".tishi").html("上传成功")
            }

        })
    })
</script>
</body>
</html>

 view.py

def ajaxupload(request):
    return render(request,"ajaxupload.html")

def get_upload(request):
    if request.method == "POST":
        print("FIFLE", request.FILES)
        file_obj = request.FILES.get("file")
        print(file_obj.name, "-----")
        file_obj = request.FILES.get("file")
        with open(file_obj.name, "wb") as f:
            for i in file_obj:
                f.write(i)
        return HttpResponse("上传成功")

 

posted @ 2018-05-01 21:30  TheLand  阅读(172)  评论(0)    收藏  举报