方式一:通过form表单中,html input 标签的“file”完成

  1. # 前端代码uoload.html
  2. <form method="post" action="/upload/" enctype="multipart/form-data">
  3. <input id="user" type="text" name="user" />
  4. <input id='img' type="file" name="img" />
  5. <input type="submit" />
  6. </form>
  1. # 后端代码
  2. def upload(request):
  3. if request.method == 'POST':
  4. ret = {'status': False, 'data': None, 'error': None}
  5. try:
  6. user = request.POST.get('user')
  7. img = request.FILES.get('img')
  8. f = open(os.path.join('static', img.name), 'wb')
  9. for chunk in img.chunks(chunk_size=1024):
  10. f.write(chunk)
  11. ret['status'] = True
  12. ret['data'] = os.path.join('static', img.name)
  13. except Exception as e:
  14. ret['error'] = e
  15. finally:
  16. f.close()
  17. return HttpResponse(json.dumps(ret))
  18. return render(request, 'upload.html')

方法二:利用XmlHttpRequest对象,发送原生的Ajax请求

(这种方法不能发送文件,需要依赖另外一个对象FormData)

  1. # 方法
  2. a. void open(String method,String url,Boolen async)
  3. 用于创建请求
  4.  
  5. 参数:
  6. method 请求方式(字符串类型),如:POSTGETDELETE...
  7. url 要请求的地址(字符串类型)
  8. async 是否异步(布尔类型)
  9.  
  10. b. void send(String body)
  11. 用于发送请求
  12.  
  13. 参数:
  14. body 要发送的数据(字符串类型)
  15.  
  16. c. void setRequestHeader(String header,String value)
  17. 用于设置请求头
  18.  
  19. 参数:
  20. header 请求头的key(字符串类型)
  21. vlaue 请求头的value(字符串类型)
  22.  
  23. d. String getAllResponseHeaders()
  24. 获取所有响应头
  25.  
  26. 返回值:
  27. 响应头数据(字符串类型)
  28.  
  29. e. String getResponseHeader(String header)
  30. 获取响应头中指定header的值
  31.  
  32. 参数:
  33. header 响应头的key(字符串类型)
  34.  
  35. 返回值:
  36. 响应头中指定的header对应的值
  37.  
  38. f. void abort()
  39.  
  40. 终止请求
  41.  
  42. # 属性
  43. a. Number readyState
  44. 状态值(整数)
  45.  
  46. 详细:
  47. 0-未初始化,尚未调用open()方法;
  48. 1-启动,调用了open()方法,未调用send()方法;
  49. 2-发送,已经调用了send()方法,未接收到响应;
  50. 3-接收,已经接收到部分响应数据;
  51. 4-完成,已经接收到全部响应数据;
  52.  
  53. b. Function onreadystatechange
  54. readyState的值改变时自动触发执行其对应的函数(回调函数)
  55.  
  56. c. String responseText
  57. 服务器返回的数据(字符串类型)
  58.  
  59. d. XmlDocument responseXML
  60. 服务器返回的数据(Xml对象)
  61.  
  62. e. Number states
  63. 状态码(整数),如:200404...
  64.  
  65. f. String statesText
  66. 状态文本(字符串),如:OKNotFound...
  67.  
  68. XmlHttpRequest对象的主要属性和方法

XmlHttpRequest对象的主要属性和方法

  1. <input type="button" value="XMLHttpRequest按钮" onclick="XHRAjax();">
  2.  
  3. <script>
  4. function XHRAjax() {
  5. var xhr = new XMLHttpRequest();
  6. xhr.onreadystatechange = function () { # 回调函数--每当请求变化时,都会被触发,比如:创建、opensendrecv等。
  7. if(xhr.readyState == 4){ # 仅当服务器数据全部返回时触发
  8. var data = xhr.responseText;
  9. console.log(data)
  10. }
  11. };
  12. // GET请求
  13. // xhr.open('GET', '/xhr_ajax?p=123');
  14. // xhr.send();
  15. // POST请求
  16. xhr.open('POST', '/xhr_ajax/'); # 这里的URL必须加斜杠结尾。 发送post请求的时候必须携带请求头
  17. xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8');
  18. // 发送请求
  19. xhr.send('n1=1;n2=2;');
  20. };
  21. </script>
  1. def ajax(request):
  2. import time
  3. current_time = time.time()
  4. return render(request, 'ajax.html', {'current_time': current_time})

上述的内容,已经可以完成原生ajax的发送。 如果需要发送文件,则需要借助于FormData对象.下边介绍一下FormData的简单用法

  1. # 前端代码
  2.  
  3. <input type="button" value="XMLHttpRequest-FormData按钮" onclick="XHRAjaxForm();">
  1. # 后端代码: 基于FormData对象发送请求
  2. function XHRAjaxForm() {
  3. var xhr = new XMLHttpRequest();
  4. xhr.onreadystatechange = function () {
  5. if(xhr.readyState == 4){
  6. var data = xhr.responseText;
  7. console.log(data)
  8. }
  9. };
  10. xhr.open('POST', '/xhr_ajax/');
  11. // 发送请求
  12. var form = new FormData(); # 创建FormData对象
  13. form.append('user', 'alex');
  14. form.append('pwd', '');
  15. xhr.send(form);
  16. };

上面的例子,简单的介绍了FormData的用法 。下边的案例介绍如何使用formdate对象来上传文件

  1. 前端部分
  2. <a onclick="uploadfile1();" style="cursor: pointer; display: inline-block;background-color: aqua">XMLHttpRequet上传</a>
  3.  
  4. # JS部分
  5. <script>
  6. function uploadfile1() {
  7. var form = new FormData();
  8. form.append('user', document.getElementById('user').value);
  9.  
  10. var fileobj = document.getElementById('img').files[0];
  11. form.append('img', fileobj);
  12.  
  13. var xhr = new XMLHttpRequest();
  14. xhr.onreadystatechange = function () {
  15. if(xhr.readyState == 4){
  16. var data = xhr.responseText;
  17. console.log(data)
  18. }
  19. };
  20. xhr.open('post', '/upload/', true)
  21. xhr.send(form);
  22. }
  23. </script>

方法三:利用JQuery Ajax + FormData进行文件上传

Jquery转换为dom对象:$("#img")[0].files[0];   其中$("#img")是jquery对象, $("#img")[0]是dom对象

  1. <a onclick="uploadFile2();" style="cursor: pointer; display: inline-block;background-color: aqua">JQuery-Ajax上传</a>
  2.  
  3. <script>
  4.  
  5. function uploadFile2() {
  6. var fileobj = $("#img")[0].files[0];
  7. console.log(fileobj);
  8. var form = new FormData();
  9. form.append("img", fileobj);
  10. form.append("uesr", 'alex');
  11. $.ajax({
  12. type: 'POST',
  13. url: '/upload/',
  14. data: form,
  15. processData: false, # 告诉jquery要传输data对象
  16. contentType: false, # 告诉jquery不需要增加请求头对于contentType的设置
  17. success: function (arg) {
  18. console.log(arg)
  19. }
  20. })
  21. }
  22. </script>

方法四:基于Iframe 实现伪Ajax 上传文件

  1. <a onclick="uploadFile3();" style="cursor: pointer; display: inline-block;background-color: aqua">IFrame上传</a>
  2.  
  3. <script>
  4. function uploadFile3() {
  5. // target 是个name的属性值,而不是id
  6. $("#container").find('img').remove();
  7. document.getElementById("my_iframe").onload = callback;
  8. document.getElementById('fo').target = 'my_iframe';
  9. document.getElementById('fo').submit();
  10. }
  11. function callback() {
  12. var t = $('#my_iframe').contents().find('body').text();
  13. var json_data = JSON.parse(t);
  14. console.log(json_data);
  15. if(json_data.status){
  16. // 上传成功
  17. var tag = document.createElement('img');
  18. tag.src = "/" + json_data.data;
  19. tag.className = 'img';
  20. $('#container').append(tag);
  21.  
  22. }else{
  23. // 上传失败
  24. console.log(status.error);
  25. }
  26.  
  27. }
  28. </script>

不是所有的浏览器都可以兼容FormData对象。为了兼容性,引出iframe 的用法。

  iframe可以建立一个通道发送请求,利用iframe局部刷新的特性实现目标。

  1. # 前端代码
  2. <iframe name="my_iframe" style="display: none;" src=""></iframe>
  3. # 这里使用的是name标签,和id标签无关
  4.  
  5. <a onclick="uploadFile3();" style="cursor: pointer; display: inline-block;background-color: aqua">IFrame上传</a>
  6.  
  7. <div id="container"></div>
  8.  
  9. <script>
  10. function uploadFile3() {
  11. // target 是个name的属性值,而不是id
  12. $("#container").find('img').remove();
  13. document.getElementById("my_iframe").onload = callback; # 通过js手动绑定一个事件
  14. document.getElementById('fo').target = 'my_iframe'; # 这里target对应的是一个iframe 的name属性
  15. document.getElementById('fo').submit();
  16. }
  17. function callback() {
  18. var t = $('#my_iframe').contents().find('body').text();
  19. var json_data = JSON.parse(t);
  20. console.log(json_data);
  21. if(json_data.status){  
  22. // 上传成功
  23. var tag = document.createElement('img');
  24. tag.src = "/" + json_data.data;
  25. tag.className = 'img';
  26. $('#container').append(tag);
  27.  
  28. }else{
  29. // 上传失败
  30. console.log(status.error);
  31. }
  32.  
  33. }
  34.  
  35. </script>

ajax以及文件上传的几种方式的更多相关文章

  1. curl文件上传有两种方式,一种是post_fileds,一种是infile

    curl文件上传有两种方式,一种是POSTFIELDS,一种是INFILE,POSTFIELDS传递@实际地址,INFILE传递文件流句柄! );curl_setopt($ch, CURLOPT_PO ...

  2. Java文件上传的几种方式

    文件上传与文件上传一样重要.在Java中,要实现文件上传,可以有两种方式: 1.通过Servlet类上传 2.通过Struts框架实现上传 这两种方式的根本还是通过Servlet进行IO流的操作. 一 ...

  3. web 文件上传的几种方式

    问题 文件上传在WEB开发中应用很广泛. 文件上传是指将本地图片.视频.音频等文件上传到服务器上,可以供其他用户浏览或下载的过程. 以下总结了常见的文件(图片)上传的方式和要点处理. 表单上传 这是传 ...

  4. Python菜鸟之路:Django 文件上传的几种方式

    方式一:通过form表单中,html input 标签的“file”完成 # 前端代码uoload.html <form method="post" action=" ...

  5. 利用Selenium实现图片文件上传的两种方式介绍

    在实现UI自动化测试过程中,有一类需求是实现图片上传,这种需求根据开发的实现方式,UI的实现方式也会不同. 一.直接利用Selenium实现 这种方式是最简单的一种实现方式,但是依赖于开发的实现. 当 ...

  6. Servlet中文件上传的几种方式

    上传文件,因为上传的都是二进制数据,所以在Servlet中就不能直接用request.getParameter();方法进行数据的获取,需要借助第三方jar包对上传的二进制文件进行解析.常用的方式如下 ...

  7. python文件上传的三种方式

    def upload(request): return render(request, 'upload.html') def upload_file(request): username = requ ...

  8. ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)

    Bipin Joshi (http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx) Uplo ...

  9. python django + js 使用ajax进行文件上传并获取上传进度案例

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. [Python]IndentationError: unindent does not match any outer indentation level

    这个是缩进没对齐 可能是混用了tab与空格,到这里显示空白就可以看出来.

  2. WKWebView简单使用

    #import <WebKit/WebKit.h> @interface SchoolOverviewsViewController ()<WKUIDelegate,WKNaviga ...

  3. dzzoffice 任意文件删除漏洞分析

    dzzofiice 任意文件删除漏洞 \upload\dzz\system\dzzcp.php第199行 elseif($do=='deleteIco'){    $arr=array();    $ ...

  4. Android -Cannot run program "XXX/sdk/tools/emulator": error=2, No such file or directory

    I have installed android SDK and eclipse successfully on ubuntu 14.04. However,now it's not running. ...

  5. matlab各向异性扩散滤波

    主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的(和双边滤波很像). 通常我们有将图像看作矩阵的,看作图的,看作随机过程的,记得过去还有看作力场的. 这次新鲜,将图 ...

  6. javaScript中的严格模式 (译)

    “use strict”状态指示浏览器使用严格模式,是javaScript中一个相对少且安全的特征集. 特征列表(非完全列举) 不允许定义全局变量.(捕获没有用var声明的变量和变量名的拼写错误) 在 ...

  7. nodejs 快要变成爬虫界的王者

    nodejs 快要变成爬虫界的王者 爬虫这东西是很多数据采集必须要的东西. 但是现在随着网页不断发展,已经出现了出单纯的网页,到 ajax 网页, 再到 spa , 再到 websocket 应用,一 ...

  8. hihocoder1032 最长回文子串

    思路: manacher模板. 实现: #include <iostream> #include <cstring> using namespace std; ]; strin ...

  9. iOS 自定义读写文件

    LSCacheFile.h // // LSCacheFile.h // iPhone // // Created by xujinzhong on 14-6-5. // Copyright (c) ...

  10. 小tip: 使用CSS将图片转换成黑白(灰色、置灰)[转]

        小tip: 使用CSS将图片转换成黑白(灰色.置灰) 这篇文章发布于 2012年08月19日,星期日,20:41,归类于 css相关, SVG相关. 阅读 159943 次, 今日 146 次 ...