Ajax实现文件的上传

准备

ajax的参数补充
  • type不写的话默认是GET

  • dataType和ContentType:

    dataType: 浏览器发给服务器希望返回的数据类型 。。

如果明确地指定目标类型,就可以使用data Type。

    ContentType:       请求头里有:浏览器告诉服务器内容的类型

      响应头里也有:服务器响应浏览器的内容

JS和JQuery之间的转换
  • jQuery对象加[0]就转换成了dom对象

  • dom对象加$符就转换成了jquery对象

processDate
  • processDate 默认为True ,预处理; 如果改为False,不做预处理

csrf跨站请求伪造

如果把type:"GET" 改为type:"POST" 会报一个Forbidden的错

解决办法有三种:

方式一:

     $.ajaxSetup({
          data:{csrfmiddlewaretoken:'{{ csrf_token }}'}
      });
    注意:要放在ajax请求的前面,在发送之前组装一组字符串,在第一步render的时候就发了
    所以有局限性:
      如果把JS代码放到静态文件中,不会渲染,不会执行{{csrf_token}},只能在HTML页面中使用

方式二:自己组装一组键值对 ( 推荐)

<form>
{% csrf_token %}
</form>
data:{
      csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(),
      name:$(":text").val(),
      pwd:$(":password").val()
},

方式三:自己设置头信息

<script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script>

$.ajax({
          url:"/serialize/",
          type:"POST",
          headers:{"X-CSRFToken":$.cookie('csrftoken')},
      })

JQuery.serialize()

serialize()函数用于序列化一组表单元素,将表单内容编码为用于提交的字符串

serialize()函数常用于将表单内容序列化,以便用于AJAX提交。

该函数主要根据用于提交有效表单控件的name和value,将它们拼接为一个可直接用于表单提交的文本

字符串,该字符串已经过标准的URL编码处理(字符集编码为UTF-8)。

该函数不会序列化不需要提交的表单控件,这和常规的表单提交行为是一致的。例如:不在<form>标签内

的表单控件不会被提交、没有name属性的表单控件不会被提交、带有disabled属性的表单控件不会被提

交、没有被选中的表单控件不会被提交。

与常规表单提交不一样的是:常规表单一般会提交带有name的按钮控件,而serialize()函数不会序列化带有name的按钮控件。更多详情请点击这里。

语法:

jQueryObject.serialize( )

serialize()函数的返回值为String类型,返回将表单元素编码后的可用于表单提交的文本字符串。

请参考下面这段初始HTML代码:

<form name="myForm" action="http://www.365mini.com" method="post">
  <input name="uid" type="hidden" value="1" />
  <input name="username" type="text" value="张三" />
  <input name="password" type="text" value="123456" />
  <select name="grade" id="grade">
      <option value="1">一年级</option>
      <option value="2">二年级</option>
      <option value="3" selected="selected">三年级</option>
      <option value="4">四年级</option>
      <option value="5">五年级</option>
      <option value="6">六年级</option>
  </select>
  <input name="sex" type="radio" checked="checked" value="1" />男
  <input name="sex" type="radio" value="0" />女
  <input name="hobby" type="checkbox" checked="checked" value="1" />游泳
  <input name="hobby" type="checkbox" checked="checked" value="2" />跑步
  <input name="hobby" type="checkbox" value="3" />羽毛球
  <input name="btn" id="btn" type="button" value="点击" />
</form>

对<form>元素进行序列化可以直接序列化其内部的所有表单元素。

// 序列化<form>内的所有表单元素
// 序列化后的结果:uid=1&username=%E5%BC%A0%E4%B8%89&password=123456&grade=3&sex=1&hobby=1&hobby=2
alert( $("form").serialize() );

我们也可以直接对部分表单元素进行序列化。

// 序列化所有的text、select、checkbox表单元素
// 序列化后的结果:username=%E5%BC%A0%E4%B8%89&password=123456&grade=3&hobby=1&hobby=2
alert( $(":text, select, :checkbox").serialize() );

示例:

 1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4     <meta charset="UTF-8">
5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
6     <meta name="viewport" content="width=device-width">
7     <title>Title</title>
8 </head>
9 <body>
10 <form name="myForm" action="http://www.365mini.com" method="post">
11     <input name="uid" type="hidden" value="1" />
12     <input name="username" type="text" value="张三" />
13     <input name="password" type="text" value="123456" />
14     <select name="grade" id="grade">
15         <option value="1">一年级</option>
16         <option value="2">二年级</option>
17         <option value="3" selected="selected">三年级</option>
18         <option value="4">四年级</option>
19         <option value="5">五年级</option>
20         <option value="6">六年级</option>
21     </select>
22     <input name="sex" type="radio" checked="checked" value="1" />男
23     <input name="sex" type="radio" value="0" />女
24     <input name="hobby" type="checkbox" checked="checked" value="1" />游泳
25     <input name="hobby" type="checkbox" checked="checked" value="2" />跑步
26     <input name="hobby" type="checkbox" value="3" />羽毛球
27     <input name="btn" id="btn" type="button" value="点击" />
28 </form>
29 <script src="/static/jquery-3.2.1.min.js"></script>
30 <script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script>
31 <script>
32     $("#btn").click(function () {
33 {#       方式一#}
34         //$.ajaxSetup({
35           // data:{csrfmiddlewaretoken:'{{ csrf_token }}'}
36         //});
37         $.ajax({
38             url:"/serialize/",
39             type:"POST",
40 {#           方式三#}
41             headers:{"X-CSRFToken":$.cookie('csrftoken')},
42             //data:$("form").serialize(),   //序列form表单所有的
43             data:$(":text,:password,:checkbox").serialize(), //序列自己选择的
44             success:function (data) {
45                 var data=JSON.parse(data); //js中的反序列化
46                 console.log(data);
47                 console.log(typeof data);
48                 $(".error").html(data);
49             }
50         })
51     })
52 </script>
53 </body>
54 </html>
1 def serialize(request):
2     # form = request.POST
3     # print(form)
4     name = request.POST.get("username")
5     password = request.POST.get("password")
6     checked = request.POST.getlist("hobby")
7     print(name,password,checked)
8     return HttpResponse(json.dumps(name))
当有好多input的时候,就得一一对应的吧所有的数据发过去的,这样显得麻烦,我们用序列化
jQuery.serialize()

data:$("form").serialize(),   //序列form表单所有的
data:$(":text,:password,:checkbox").serialize(), //序列自己选择的

在服务端获取数据
form = request.POST  
print(form)   #获取所有
name = request.POST.get("username")
password = request.POST.get("password")
checked = request.POST.getlist("hobby")
print(name,password,checked)#获取单个

文件上传:

1、Form表单上传文件

文件和其他的数据类型不一样,是一个二进制的形式 Form上传文件的时候切记要加上:enctype="multipart/form-data"

formupload.html

<form action="/formupload/" method="post" enctype="multipart/form-data">
  {% csrf_token %}
  <p>姓名:<input type="text" name="username"></p>
  <p>密码:<input type="password" name="password"></p>
  <p>头像:<input type="file" name="file"></p>
  <p><input type="submit" value="提交"></p>
</form>

view.py

def formupload(request):
  if request.method == "POST":
      username = request.POST.get("username")
      password = request.POST.get("password")
      # file = request.FILES   #拿到的是一个句柄
      file_obj = request.FILES.get("file")
      print(file_obj,file_obj.name)
      print(type(file_obj),type(file_obj.name))   #<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>   <class 'str'>
      with open(file_obj.name,"wb") as f:
          for i in file_obj:
              f.write(i)
      return HttpResponse("上传成功...")
  return render(request,"formupload.html")

2、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("上传成功")

Ajax实现文件的上传的更多相关文章

  1. SpringMVC+Ajax实现文件批量上传和下载功能实例代码

    需求: 文件批量上传,支持断点续传. 文件批量下载,支持断点续传. 使用JS能够实现批量下载,能够提供接口从指定url中下载文件并保存在本地指定路径中. 服务器不需要打包. 支持大文件断点下载.比如下 ...

  2. spring mvc ajax异步文件的上传和普通文件上传

    表单提交方式文件上传和ajax异步文件上传 一:首先是我在spring mvc下的表单提交方式上传 ssm的包配置我就不一一详细列出来了,但是上传的包我还是列出来 这一段我也不知道怎么给大家讲解就是直 ...

  3. ajax和原生ajax、文件的上传

    ajax理解: ajax发送的请求是异步处理的.也就是说如下形式: function f1(){ $.ajax( { ....... success:function(){ a= return a } ...

  4. php下ajax的文件切割上传

    html5中的File对象继承Blob二进制对象,Blob提供了一个slice函数,可以用来切割文件数据. <!DOCTYPE HTML> <html lang="zh-C ...

  5. AJAX大文件切割上传以及带进度条。

    分块传输的原理就是利用HTML5新增的文件slice截取函数. 代码如下: html: <input id="f" type="file" name=&q ...

  6. 文件的上传(表单上传和ajax文件异步上传)

    项目中用户上传总是少不了的,下面就主要的列举一下表单上传和ajax上传!注意: context.Request.Files不适合对大文件进行操作,下面列举的主要对于小文件上传的处理! 资源下载: 一. ...

  7. 普通文件的上传(表单上传和ajax文件异步上传)

    一.表单上传: html客户端部分: <form action="upload.ashx" method="post" enctype="mul ...

  8. SpringMVC + AJAX 实现多文件异步上传

    转自:https://www.jianshu.com/p/f3987f0f471f 今天,我就这个问题来写一篇如何用 SpringMVC + AJAX 实现的多文件异步上传功能.基本的代码还是沿用上篇 ...

  9. Ajax+Java实现大文件切割上传

    技术体系:html5(formdata) + java + servlet3.0+maven + tomcat7 <!DOCTYPE html> <html> <head ...

随机推荐

  1. buf.writeUInt8()函数详解

    buf.writeUInt8(value, offset[, noAssert]) value {Number} 需要被写入到 Buffer 的字节 offset {Number} 0 <= o ...

  2. Xcode 出现Thread 1: signal SIGABRT

    代码语言:C 出现原因:数组初始化时,循环赋值越界. 例 bool type [30]; for (int i = 0;i<100;i++) type = 0;

  3. python学习,使用requests库来模拟登录github,post请求。

    这次我们要模拟登录的页面是 https://github.com/login 首先我们先尝试着登陆一遍分析一下请求, 打开开发者工具下的network选项, 可以很清楚的看到这个会话session,而 ...

  4. Jmeter使用基础笔记-认识Jmeter

    我在工作过程中接触Jmeter不算特别多,对Jmeter的使用也只是限于基础阶段,不过对付基本的一些需求我想足够使用了.有好几个朋友问我关于Jmeter的问题,在此我将我在工作过程中的使用心得和总结的 ...

  5. react入门----组件的基础用法

    1.组件 <!-- React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件.React.createClass 方法就用于生成一个组件类 ...

  6. 使用JdbcTemplate和JdbcDaoSupport

    [Spring对JDBC的支持] [JDBCTemplate简介] 1.为了是JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架. 2.作为Sprin ...

  7. 【Codeforces 1038D】Slime

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 相当于让你确定每个数字前面的系数是-1还是+1 有个结论是这样每次和相邻的减的话, 任何出除了全"-1"和全"+ ...

  8. noip模拟赛 寻宝之后

    题目背景 还记得NOIP2011的寻宝吗?6年之后,小明带着他的妹子小芳,再次走上了寻宝的道路. 然而这次他们寻宝回来之后,小明被困在了一个迷宫中. 题目描述 迷宫是一个n*m的字符矩阵. 小明在这个 ...

  9. Java遍历一个文件夹下的全部文件

    Java工具中为我们提供了一个用于管理文件系统的类,这个类就是File类,File类与其它流类不同的是,流类关心的是文件的内容.而File类关心的是磁盘上文件的存储. 一,File类有多个构造器,经常 ...

  10. 玩转CPU之直线

    近期在看编程之美,看到第一个问题时,一下子就被吸引了,原来在windows 的任务管理器中还能够让CPU舞动起来,再一次的相信了编程中仅仅有想不到没有做不到,对于书中的做法和网上的实现大致都同样.只是 ...