对于HTML5已经支持AJAX文件上传了,但如果需要兼容的话还是得用一点小技巧的,HTML5等等介绍,先来看看以前我们是怎么写的。

  网上可能会有一些叫AJAX文件上传插件,但在AJAX2.0之前是不可能实现的,因为浏览器的原因,AJAX根本获取不了文件信息,当然这里并不是说就不能文件上传了,只是说在AJAX2.0之前所谓的AJAX文件上传都是假冒的,核心更本没有用AJAX,而是利用iframe实现的,下面我们来看看如何利用iframe实现页面无刷新上传文件。

iframe无刷新上传文件版。

html:

<form action="http://127.0.0.1/index.php" method="POST" target="postFile" enctype="multipart/form-data">
  <input type="file" name="fs">
  <input type="submit" value="上传">
</form>
<iframe name="postFile" frameborder="0"></iframe>

php:

<?php
  if(empty($_FILES)){
    exit('空文件');
  }
  if($_FILES['fs']['error']!=0){
    exit('上传失败');
  }
  // 移动临时文件到a目录下
  move_uploaded_file($_FILES['fs']['tmp_name'],'a/'.$_FILES['fs']['name']);

  echo 'ok';
?>

效果:

可以看到页面并没有被刷新。

原理就是将form里面的数据提交到iframe框架里面。

给用户提示个正着上传比较好一些。

html:

<style>
#img{
display:none;
}
</style>

<form action="http://127.0.0.1/index.php" method="POST" target="postFile" enctype="multipart/form-data">
  <input type="file" name="fs">
  <input type="submit" value="上传">
</form>
<img src="loader.png" alt="" id="img">
<iframe name="postFile" frameborder="0"></iframe>
<script>
  var form = document.getElementsByTagName('form')[0];
  var img = document.getElementById('img');
  form.onsubmit = function(){
    img.style.display = 'block';
  };
</script>

php:

<?php
if(empty($_FILES)){
  exit('空文件');
}
if($_FILES['fs']['error']!=0){
  exit('上传失败');
}

// 移动临时文件到a目录下
move_uploaded_file($_FILES['fs']['tmp_name'],'a/'.$_FILES['fs']['name']);

// 文件上传成功以后将提示隐藏。

echo '<script>parent.document.getElementById("img").style.display="none";</script>';

echo 'ok';
?>

ok。不过这种方式虽然可以实现但多少有些不足,比如无法知道文件到底上传了多少。接下来介绍HTML5新增的API,非常强大。

html5新增了一个FormData对象,它可以用来操作表单。

例子1:上传文件

<form action="http://127.0.0.1/index.php" method="POST" enctype="multipart/form-data">
  <input type="file" name="fs">
  <input id="btn" type="button" value="上传">
</form>
<img src="loader.png" alt="" id="img">

<script>
var form = document.getElementsByTagName('form')[0];
var btn = document.getElementById('btn');
var img = document.getElementById('img');

btn.onclick = function(){
  var formData = new FormData(form);
  ajax(formData);

  img.style.display = 'block';
};

function ajax(data){
  var xhr = new XMLHttpRequest();
  xhr.open('POST','http://127.0.0.1/index.php');
  xhr.send(data);
  xhr.onreadystatechange = function(){
    if(this.readyState===4 && this.status===200){
      if(this.responseText==='1'){
        parent.document.getElementById("img").style.display="none";
        console.log('ok');
      }
    }
  };
}
</script>

直接把form表单传到FormData中就可以了,它内部会帮你处理。除了上传文件以外,FormData还有很多功能,比如之前我们提交表单还得一个一个操作表单的值,现在我们通过直接把form写进去的可以达到同样的效果,一起来看看。

和上传图片一样,就不贴代码了。

除了这个,FormData还允许你手动创建数据。

使用方法如下:

var formData = new FormData();
formData.append('sex','男');

不得不说这个方法还是很强大的,拥有这个方法我们可以干很多事。

关于文件的还新增了一个files属性,来看看。

通过files属性我们可以得到文件的大小以及文件名等,另外还可以将这个对象传到FormData里面当文件上传。

有了它我们还可以做图片预览功能噢,不过需要配合window.URL.createObjectURL来操作。

var f = document.getElementById('f').files[0];

var img = new Image();
img.src = window.URL.createObjectURL(f);
document.body.appendChild(img);

ok。

ajax2.0还新增了一下属性和事件,这里拿文件上传事件来讲。

有时候我们需要做文件上传进度条,那么我们就可以利用下面的这些方法。

ajax里面有一个upload属性,表示文件上传。里面还有一个文件上传中的事件onprogress

var xhr = new XMLHttpRequest();
xhr.open('POST','http://127.0.0.1/index.php');

xhr.upload.onprogress = function(e){
  console.log((e.loaded/e.total)*100);
};

xhr.onreadystatechange = function(){
 //xxxxx
};

xhr.send(data);

我们来打印一下这个事件里面都有什么东西。

xhr.upload.onprogress = function(e){
  console.log(e);
};

loaded:当前已上传的文件大小

total:文件总大小

我们通过(e.loaded/e.total)*100就可以算出它们的百分比来了。

AJAX文件上传实践与分析,带HTML5文件上传API。的更多相关文章

  1. HTML5 : 文件上传下载

    网站建设中,文件上传与下载在所难免,HTML5中提供的API在前端有着丰富的应用,完美的解决了各个浏览器的兼容性问题,所以赶紧get吧! FileList 对象和 file 对象 HTML 中的 in ...

  2. html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器

    以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一般的上传没有问题,不过如果是上传图片,且需要预览的话,就力有不逮了,趁着闲暇时间,给上 ...

  3. C++ Primer 学习笔记_35_STL实践与分析(9)--map种类(在)

    STL实践与分析 --map类型(上) 引: map是键-值对的集合. map类型通常能够理解为关联数组:能够通过使用键作为下标来获取一个值,正如内置数组类型一样:而关联的本质在于元素的值与某个特定的 ...

  4. 使用ajax上传表单(带文件)

    在使用form表单的时候上传文件+表单,会使得页面跳转,而在某些时候不希望跳转,只变化页面中的局部信息 通过查找资料,可以使用FormData进行ajax操作. FormData介绍:XMLHttpR ...

  5. PHP+ajaxForm异步带进度条上传文件实例

    在使用ajaxForm方法之前,首先需要安装form.js的插件,网上有: 一.首先说用法,ajaxForm可以接收0或1个参数,该参数可以是一个变量.一个对象或回调函数,这个对象主要有以下参数: v ...

  6. ajax 提交所有表单内容及上传图片(文件),以及单独上传某个图片(文件)

    我以演示上传图片为例子: java代码如下(前端童鞋可以直接跳过看下面的html及js): package com.vatuu.web.action; import java.io.File; imp ...

  7. node.js+react全栈实践-Form中按照指定路径上传文件并

    书接上回,讲到“使用同一个新增弹框”中有未解决的问题,比如复杂的字段,文件,图片上传,这一篇就解决文件上传的问题.这里的场景是在新增弹出框中要上传一个图片,并且这个上传组件放在一个Form中,和其他文 ...

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

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

  9. OpenSNS后台文件上传漏铜分析

    前言 这几天正在想找个文件上传漏洞分析一波,以加深对文件上传漏洞的理解,正好看到FreeBuf的一片文章记对OpenSNS的一次代码审计,由于其只对漏洞进行复现,故在此进行代码层面的分析. 漏洞分析 ...

随机推荐

  1. 分析sql语句所有表名及其别名的正则表达式

    最近为了 写一个分布式的数据组件构想了很多的方案,最近一个简单易行的方案终于在脑袋里成型.昨晚想到凌晨1点多,发现方案虽简单,但所有的数据库工具就不能使用了 .除非自己写一下查询分析器来执行程序员自己 ...

  2. SAS 画折线图PROC GPLOT

    虽然最后做成PPT里的图表会被要求用EXCEL画,但当我们只是在分析的过程中,想看看数据的走势,直接在SAS里画会比EXCEL画便捷的多. 修改起来也会更加的简单,,不用不断的修改程序然后刷新EXCE ...

  3. 关于PDV的那些事

    数据集中的数据来源分为两种: 一.来自于另一个数据集: 二.来自于外部数据源(本文细说此来源): 无论是哪种来源,在它们成为目标数据集中的观测行(官方叫它observation)之前都要进入PDV,先 ...

  4. ios页面保存至桌面logo大小

    <link rel="apple-touch-icon" href="touch-icon-iphone.png" /> <!--57*57- ...

  5. java7笔记

    1 switch case 增加字符串类型,原理根据字符串hashcode以及string.equal比较2 数值字面量改进 新增二进制数值字面量 0b000004,在数值中间新增下划线方便阅读200 ...

  6. LR loadrunner参数化-笔记

      LR在录制程序运行的过程中,VuGen(脚本生成器) 自动生成了包含录制过程中实际用到的数值的脚本,如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如查询.提交等等),那么你必须用参数值取代 ...

  7. Python成长笔记 - 基础篇 (十二)

    本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 主题:学员管理系统 需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的 ...

  8. day11---异步IO\数据库\队列\缓存

    一.RabbitMQ队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息 ...

  9. PHP 计算每个月的最后一天

    主要用到了 PHP 的 date() 函数和 mktime() 函数. date() 函数的 format 参数用到了选项 t,它表示某个月总共有多少天,数值范围为28-31. mktime() 函数 ...

  10. .Net Core CLI–Ubuntu 14安装

    sudo sh -c 'echo "deb [arch=amd64] http://apt-mo.trafficmanager.net/repos/dotnet/ trusty main&q ...