ajax利用FormData、FileReader实现多文件上传php获取

简介:

一、FormData方式

  1. 前台代码(注意,不需要用到form标签):
    a. html部分:
    ajax利用FormData、FileReader实现多文件上传php获取
    b. js部分:
    ajax利用FormData、FileReader实现多文件上传php获取
    c. 完整代码:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
    <meta charset="UTF-8">
    <title>Document</title></head>
    
    <body>
    <form>
      <input type="file" multiple id="lee_file">
      <input type="text" id="lee_text" value="test">
      <input type="button" value="上传图片" id="lee_button"></form>
    <script type="text/javascript" src="jquery.min.js"></script>
    <script>var lee_button = $('#lee_button');
      function sendFile() {
        var lee_file = $('#lee_file');
        var lee_text = $('#lee_text');
        var form_data = new FormData();
        for (var i in lee_file[0].files) {
          form_data.append('pics[]', lee_file[0].files[i]);
        }
        form_data.append('text', lee_text.val());
        $.ajax({
          url: 'http://localhost/111.php',
          type: 'POST',
          cache: false,
          data: form_data,
          processData: false,
          contentType: false
        }).done(function(res) {
          console.log(res);
        }).fail(function(res) {
          console.log('fail');
        });
      }
      lee_button.click(function() {
        sendFile();
      })</script>
    </body>
    </html>
  2. php获取(用 $_FILE 获取):
    ajax利用FormData、FileReader实现多文件上传php获取
    完整代码:
    <?php
    header('Access-Control-Allow-Origin: *');
    $pics = $_FILES['pics'];
    var_dump($pics);
    $text = $_POST['text'];
    var_dump($text);

    二、FileReader+FormData+base64

  3. 前台代码:
    a. html代码:
    ajax利用FormData、FileReader实现多文件上传php获取
    b. js代码:
    ajax利用FormData、FileReader实现多文件上传php获取
    c. 完整代码:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
    <meta charset="UTF-8">
    <title>Document</title></head>
    
    <body>
    <form>
      <input type="file" multiple id="lee_file">
      <input type="button" value="上传图片" id="lee_button">
      <img src="" alt="" id="lee_img"></form>
    <script type="text/javascript" src="jquery.min.js"></script>
    <script>var lee_button = $('#lee_button');
      function sendFile() {
        var lee_file = $('#lee_file')[0].files;
        var lee_text = $('#lee_text');
        for (var i = 0; i < lee_file.length; i++) {
          file = lee_file[i];
          var form_data = new FormData();
          var reader = new FileReader();
          reader.readAsDataURL(file);
          reader.onloadend = function() { // onload代表文件读取成功
            $('#lee_img').attr('src', reader.result);
            form_data.append('pic', reader.result);
            $.ajax({
              url: 'http://localhost/111.php',
              type: 'POST',
              cache: false,
              data: form_data,
              processData: false,
              contentType: false
            }).done(function(res) {
              console.log(res);
            }).fail(function(res) {
              console.log('fail');
            });
          }
        }
      }
      lee_button.click(function() {
        sendFile();
      })</script>
    </body>
    </html>
  4. php代码(用 $_POST 获取):
    a. 允许跨域:
    ajax利用FormData、FileReader实现多文件上传php获取
    b. 将前台post过来的数据保存为临时文件:
    ajax利用FormData、FileReader实现多文件上传php获取
    c. 获取文件真实后缀函数:
    ajax利用FormData、FileReader实现多文件上传php获取
    d. 将临时文件保存为带真实后缀的文件:
    ajax利用FormData、FileReader实现多文件上传php获取
    e. 完整代码:
    <?php
    header('Access-Control-Allow-Origin:*');  
    /*
    * 将流文件保存为临时文件
    * @param   stream  base64输入流
    * @param   tmpname 临时文件路径
    */  
    function uploadBase64($stream) {
    if (empty($stream)) return false;
    if (preg_match('/^(data:\simage\/(\w+);base64,)/', $stream, $str)) {
        $suffix = "tmp";
        $tmpname = rand(1000, 9999) . ".{$suffix}";
        if (file_put_contents($tmpname, base64_decode(str_replace($str[1], '', $stream)))) {
            return $tmpname;
        } else {
            return false;
        }
    } else {
        return false;
    }
    } 
    /*
    * 获取文件类型
    * @param   filename    文件名
    * @param   suffix      文件真实后缀(.jpg .png .gif)
    */   
    function getSuffix($fileName) {
    $file = fopen($fileName, "rb");
    $bin = fread($file, 2); // 只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);
    $typeCode = intval($strInfo['chars1'] . $strInfo['chars2']);
    $suffix = ".";
    if ($typeCode == 255216) {
        $suffix.= "jpg";
    } elseif ($typeCode == 7173) {
        $suffix.= "gif";
    } elseif ($typeCode == 13780) {
        $suffix.= "png";
    } else {
        $suffix = false;
    }
    return $suffix;
    }
    $stream = $_POST['pic'];
    $tmpname = uploadBase64($stream);
    $suffix = getSuffix($tmpname);
    if ($suffix !== false) {
    $realname = rand(1000, 9999) . $suffix;
    $ret = rename($tmpname, $realname);
    if ($ret) {
        exit('上传成功');
    } else {
        exit('上传失败');
    }
    }

本文转自 Lee_吉  博客,原文链接:  http://blog.51cto.com/12173069/2059657       如需转载请自行联系原作者
相关文章
|
11天前
|
XML 前端开发 JavaScript
34 PHP与Ajax
路老师在知乎上分享了关于PHP语言的知识,帮助大家入门并深入了解PHP。本文重点介绍了Ajax技术,包括其概念、开发模式、优点及常用技术,如JavaScript和XMLHttpRequest对象。Ajax通过异步请求改善了用户体验,减轻了服务器负担,实现了页面无刷新更新。
24 1
|
2月前
|
XML 前端开发 JavaScript
php中Ajax的简单使用,登录表单调用Ajax判断是否正确登录利用layer.msg进行提示
本文介绍了在PHP中如何使用Ajax进行登录表单的数据提交,并利用jQuery的$.post()方法与后端通信,以及使用layer.msg进行前端提示。
php中Ajax的简单使用,登录表单调用Ajax判断是否正确登录利用layer.msg进行提示
|
5月前
|
PHP
php+ajax传file文件数据
php+ajax传file文件数据
46 0
|
6月前
|
前端开发 JavaScript PHP
【PHP开发专栏】jQuery与PHP实现Ajax通信
【4月更文挑战第30天】本文介绍了使用jQuery和PHP实现Ajax通信的步骤。首先,讲解了Ajax的基础和jQuery简化Ajax操作的概念。接着,展示了如何使用jQuery的`$.get()`、`$.post()`和`$.ajax()`方法发送GET和POST请求,以及如何控制请求细节。在PHP端,讨论了接收和响应Ajax请求的方法,包括处理数据、设置响应类型和错误处理。结合jQuery与PHP,开发者能实现高效、无缝的异步数据传输,提升Web应用的用户体验。
124 1
|
6月前
|
XML 前端开发 JavaScript
【PHP 开发专栏】PHP 与 Ajax 交互开发
【4月更文挑战第30天】本文探讨了PHP与Ajax交互在Web开发中的应用。Ajax负责客户端的异步请求,PHP处理服务器端业务逻辑。两者结合实现高效、流畅的用户体验。文中阐述了Ajax的工作原理,PHP的角色,数据传输格式选择,并提供了发送Ajax请求、PHP处理请求的示例代码。实际应用包括实时数据更新、表单验证和动态内容加载。开发中需注意跨域、数据安全和性能优化。PHP与Ajax的结合将继续在Web开发中发挥重要作用。
79 0
|
6月前
|
前端开发 JavaScript 关系型数据库
PHP代码合集21个邮箱2个问答23个ajax特效
PHP代码合集21个邮箱2个问答23个ajax特效
34 0
|
6月前
|
Web App开发 前端开发 JavaScript
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
72 0
|
11月前
|
前端开发 PHP 数据安全/隐私保护
【PHP学习】—利用ajax原理实现密码修改功能(九)
【PHP学习】—利用ajax原理实现密码修改功能(九)
|
11月前
|
前端开发 JavaScript PHP
【PHP学习】—利用ajax原理实现登录功能(八)
【PHP学习】—利用ajax原理实现登录功能(八)
|
JSON 前端开发 安全
ajax中实现访问url已阅即焚的解决方案(url动态参数、变量加密、常量不变、php加密解密、API访问验证方式)
ajax中实现访问url已阅即焚的解决方案(url动态参数、变量加密、常量不变、php加密解密、API访问验证方式)
285 0