php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析

本文实例讲述了php 下 html5 XHR2 + FormData + File API 上传文件操作,分享给大家供大家参考,具体如下:

FormData的作用:

FormData对象可以帮助我们自动的打包表单数据,通过XMLHttpRequest的send()方法来提交表单。当然FormData也可以动态的append数据,FormData的最大优点就是我们可以异步上传一个二进制文件。

例1如下:

  1. <!DOCTYPE HTML>
  2. <html >
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form method="post" onsubmit="return post();">
  9. 用户名<input type="text" name="uname" />
  10. 密码<input type="password" name="upwd" />
  11. 邮箱<input type="text" name="uemail" />
  12. <input type="submit" name="submit" value="提交" />
  13. </form>
  14. </body>
  15. <script type="text/javascript">
  16. function post() {
  17. var myForm = document.getElementById("myForm");
  18. //FormData既可以从表单读取数据,也可以动态append(键,值)添加
  19. var fd = new FormData(myForm);
  20. var xhr = new XMLHttpRequest();
  21. xhr.onreadystatechange = function () {
  22. if (xhr.readyState == 4) {
  23. alert(this.responseText);
  24. }
  25. };
  26. xhr.open("post", "post.php", true);
  27. xhr.send(fd);
  28. return false;
  29. }
  30. </script>
  31. </html>

File API

使用HTML5 DOM新增的File API,现在可以让网页要求用户选择本地文件,并且读取这些文件的信息了。

通过File API,我们可以在用户选取一个或者多个文件之后,访问到代表了所选文件的一个或多个File对象,这些对象被包含在一个FileList对象中。

  1. <!DOCTYPE HTML>
  2. <html >
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form method="post" >
  9. <input type="file" name="file" />
  10. <input type="submit" name="submit" value="提交" />
  11. </form>
  12. </body>
  13. <script type="text/javascript">
  14. var upfile = document.getElementById("upfile");
  15. upfile.onchange = function() {
  16. var file = this.files[0];
  17. alert("文件名:" + file.name + "\r\n" + "大小:" + file.size + "\r\n");
  18. };
  19. </script>
  20. </html>

我们通过FormData + File API 上传文件

  1. <!DOCTYPE HTML>
  2. <html >
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form method="post" >
  9. <input type="file" name="file" />
  10. <input type="submit" name="submit" value="提交" />
  11. </form>
  12. </body>
  13. <script type="text/javascript">
  14. var myForm = document.getElementById("myForm");
  15. var upfile = document.getElementById("upfile");
  16. myForm.onsubmit = function() {
  17. //我们创建一个FormData对象
  18. var fd = new FormData();
  19. var file = upfile.files[0];
  20. //把文件添加到FormData对象中
  21. fd.append("file", file);
  22. var xhr = new XMLHttpRequest();
  23. xhr.onreadystatechange = function () {
  24. if (xhr.readyState == 4) {
  25. alert(this.responseText);
  26. }
  27. };
  28. xhr.open("post", "upfile.php", true);
  29. //发送FormData对象
  30. xhr.send(fd);
  31. return false;
  32. };
  33. </script>
  34. </html>

upfile.php代码如下:

  1. <?php
  2. $uploadDir = './upload/';
  3. if(!file_exists($uploadDir)) {
  4. @mkdir($uploadDir, 0777, true);
  5. }
  6. $uploadFile = $uploadDir . basename($_FILES['file']['name']);
  7. if(move_uploaded_file($_FILES['file']['tmp_name'], $uploadFile)) {
  8. echo "OK";
  9. } else {
  10. echo "NO";
  11. }

使用对象URL来显示你所选择的图片

通过window.URL.createObjectURL()和 window.URL.revokeObjectURL()两个DOM方法。

这两个方法创建简单的URL字符串对象,用于指向任何 DOM File 对象数据,包括用户电脑中的本地文件。

  1. <!DOCTYPE HTML>
  2. <html >
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form method="post" >
  9. <input type="file" name="file" />
  10. <input type="submit" name="submit" value="提交" />
  11. </form>
  12. </body>
  13. <script type="text/javascript">
  14. var myForm = document.getElementById("myForm");
  15. var upfile = document.getElementById("upfile");
  16. upfile.onchange = function() {
  17. //创建一个img标签
  18. var img = document.createElement("img");
  19. //通过file对象创建对象URL
  20. img.src = window.URL.createObjectURL(this.files[0]);
  21. img.height = 60;
  22. img.onload = function() {
  23. //释放对象URL
  24. window.URL.revokeObjectURL(this.src);
  25. };
  26. document.body.appendChild(img);
  27. };
  28. myForm.onsubmit = function() {
  29. //我们创建一个FormData对象
  30. var fd = new FormData();
  31. var file = upfile.files[0];
  32. //把文件添加到FormData对象中
  33. fd.append("file", file);
  34. var xhr = new XMLHttpRequest();
  35. xhr.onreadystatechange = function () {
  36. if (xhr.readyState == 4) {
  37. alert(this.responseText);
  38. }
  39. };
  40. xhr.open("post", "upfile.php", true);
  41. //发送FormData对象
  42. xhr.send(fd);
  43. return false;
  44. };
  45. </script>
  46. </html>