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

前台代码(注意,不需要用到form标签):

a. html部分:

948d991bd880f62255faf05fdbc8105c.png

b. js部分:

ac09dd25fef70cf067882cfef7cd5f3c.png

c. 完整代码:

function loadDoc(file,data,async=true){

if(window.XMLHttpRequest){ // code for IE7+, Firefox, Chrome, Opera, Safari

xmlhttp=new XMLHttpRequest();

}else{ // code for IE6, IE5

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

}

if(async === true){

xmlhttp.onreadystatechange = function(){

if(xmlhttp.readyState < 4){

// 加载中

}else if (xmlhttp.readyState == 4 && xmlhttp.status == 200){

// 成功

xmlDoc=xmlhttp.responseText;

return xmlDoc

}else{

// 失败

xmlhttp.abort()

return

}

}

}

xmlhttp.open("POST",file,async);

xmlhttp.send(data);

if(async === false){

xmlDoc=xmlhttp.responseText;

return xmlDoc

}

}

function getEle(id){

var ele = document.getElementById(id)

return ele

}

function sendFile() {

var lee_file = getEle('lee_file');

var lee_text = getEle('lee_text');

var form_data = new FormData();

for (var i in lee_file.files) {

form_data.append('pics[]', lee_file.files[i]);

}

form_data.append('text', lee_text.value);

loadDoc('test.php',form_data)

}

var lee_button = getEle('lee_button');

lee_button.onclick = function(){

sendFile()

}

php获取(用 $_FILE 获取):

3a5642a234058d5b628c3e61d9071310.png

完整代码:

header('Access-Control-Allow-Origin: *');

var_dump($_POST);

var_dump($_FILES);

二、FileReader+FormData+base64

前台代码:

a. html代码:

40264a8de40cae63b38cb799fb9d3066.png

b. js代码:

38d6f77d45fc3b963c5def96c95716f7.png

c. 完整代码:

Document

function loadDoc(file,data,async=true){

if(window.XMLHttpRequest){ // code for IE7+, Firefox, Chrome, Opera, Safari

xmlhttp=new XMLHttpRequest();

}else{ // code for IE6, IE5

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

}

if(async === true){

xmlhttp.onreadystatechange = function(){

if(xmlhttp.readyState < 4){

// 加载中

}else if (xmlhttp.readyState == 4 && xmlhttp.status == 200){

// 成功

xmlDoc=xmlhttp.responseText;

return xmlDoc

}else{

// 失败

xmlhttp.abort()

return

}

}

}

xmlhttp.open("POST",file,async);

xmlhttp.send(data);

if(async === false){

xmlDoc=xmlhttp.responseText;

return xmlDoc

}

}

function getEle(id){

var ele = document.getElementById(id)

return ele

}

lee_button = getEle('lee_button')

function sendFile() {

var lee_file = getEle('lee_file').files;

var lee_text = getEle('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代表文件读取成功

getEle('lee_img').setAttribute('src',reader.result);

form_data.append('pic', reader.result);

loadDoc('test.php',form_data)

}

}

}

lee_button.onclick = function() {

sendFile();

}

php代码(用 $_POST 获取):

a. 允许跨域:

d5580863cd12da02f3b71f24d321cdb9.png

b. 将前台post过来的数据保存为临时文件:

6ca0e0c01c8c6974fda91c1a64572dcf.png

c. 获取文件真实后缀函数:

d0b97e450d040bd0ff73232bdac54a36.png

d. 将临时文件保存为带真实后缀的文件:

bb17959230b16ef570550eb3a38c7e01.png

e. 完整代码:

header('Access-Control-Allow-Origin:*');

/*

* 将流文件保存为临时文件

* @param stream base64输入流

* @param tmpname 临时文件路径

*/

function uploadBase64($stream) {

if (empty($stream)) return false;

if (preg_match('/^(data:(\s)?(image|img)\/(\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 = "unknow";

if($typeCode == 255216){

$suffix = "jpg";

}elseif($typeCode == 7173){

$suffix = "gif";

}elseif($typeCode == 13780){

$suffix = "png";

}elseif($typeCode == 6677){

$suffix = "bmp";

}elseif($typeCode == 7798){

$suffix = "exe";

}elseif($typeCode == 7784){

$suffix = "midi";

}elseif($typeCode == 8297){

$suffix = "rar";

}elseif($typeCode == 7368){

$suffix = "mp3";

}elseif($typeCode == 0){

$suffix = "mp4";

}elseif($typeCode == 8273){

$suffix = "wav";

}

return $suffix;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux设备文件的创建和mdev

以下内容源于微信公众号嵌入式企鹅圈&#xff0c;有格式内容上的修改&#xff0c;如有侵权请告知删除。 本文将从代码级去理解Linux设备类和设备文件的创建过程。 一、设备类相关知识 设备类是虚拟的&#xff0c;并没有直接对应的物理实物&#xff0c;只是为了更好地管理同一类…

JDK源码 - BitSet的实现

java.util.BitSet是个很有趣的类&#xff0c;了解其内部实现对正确的使用非常重要。 对象构造&#xff1a; Java代码 private final static int ADDRESS_BITS_PER_WORD 6; private final static int BITS_PER_WORD 1 << ADDRESS_BITS_PER_WORD; private long[] wor…

Sharepoint学习笔记—ECM系列--根据位置设置的默认元数据值(Location-Based Metadata Defaults)...

如果有这样一个需求&#xff1a;客户在一个SharePoint 2010的站点的document library中创建了不同的文件夹FolderA和FolderB&#xff0c;对于上传到此文件夹的文件记录中有某一个列ColumnM,现在他实现当上传文件到不同的文件夹FolderA或FolderB时&#xff0c;列ColumnM使用不同…

博客园的CSRF

CSRF全称 Cross Site Request Forgery&#xff0c;跨站请求伪造。通俗理解&#xff1a;攻击者盗用当前用户身份&#xff0c;发请当前用户的恶意请求&#xff1a;如邮件&#xff0c;银行转账等。 CSRF原理 CSRF过程 登录网站A&#xff0c;生成本地Cookie信息&#xff1b;登录危…

开发板——在X210开发板上进行裸机开发的细节

以下内容是学习裸机开发过程中的一些细节内容的记录。 1、汇编语言函数细节 用汇编写的函数&#xff0c;末尾应该添加mov pc,lr语句。 2、裸机代码相关文件 3、关于链接地址 4、关于重定位的理解 &#xff08;1&#xff09;在sram内部重定位 这是在sram内部重定位&#xff0c;因…

linux上perl怎么传输参数,如何在perl子函数中传递参数?

慕村225694Perl 可以通过函数元型在编译期进行有限的参数类型检验。如果你声明sub mypush ()那么 mypush() 对参数的处理就同内置的 push() 完全一样了。函数声明必须要在编译相应函数调用之前告知编译器(编译器在编译函数调用时会对相应函数用 prototype来查询它的元型来进行参…

Struts2中ValueStack结构和总结

【ValueStack和ActionContext的关系】首先&#xff0c;从结构上来看ValueStack是ActionContext的一个组成部分&#xff0c;是对ActionContext功能的扩展。ActionContext是一个容器结构&#xff0c;是Struts2中用于数据存储的的场所&#xff0c;而ValueStack则是一个具备表达式引…

浅谈mysql数据库引擎

2019独角兽企业重金招聘Python工程师标准>>> 数据库是数据的集合&#xff0c;计算机中的数据库是存储器上一些文件的集合或者是内存数据的集合。Mysql,SQL server数据库都是可以存储数据&#xff0c;并提供数据查询&#xff0c;更新功能的数据库管理系统。Mysql数据…

linux ssh抓包,如何在SSH连接Linux系统的环境下使用wireshark抓包?

TSINGSEE青犀视频云边端架构EasyNVR、EasyDSS、EasyGBS等都是有两种操作系统的版本&#xff0c;一种是linux&#xff0c;一种是windows。而大多数开发者用户都会使用linux版本进行安装。对于安装部署出现的问题&#xff0c;TSINGSEE青犀视频团队研发的经常为客户远程调试&#…

ASP.NET后台调用前台JS函数的三种常见方法

为什么80%的码农都做不了架构师&#xff1f;>>> 第一种&#xff1a;使用普通的添加控件中的Attributes属性进行调用 例如&#xff0c;像一般的普通的按钮&#xff1a;Button1.Attributes.Add("onclick","MyFun();"); 此方法只能在Onload中或者…

嵌入式数据库sqlite在ARM上的的移植和使用

参考SQLite的编译、安装和使用_whz_zb的博客-CSDN博客&#xff0c;如有侵权&#xff0c;请告知删除。 参考&#xff1a;头文件路径问题 Linux下的头文件搜索路径 - 心哲 - 博客园 参考&#xff1a;进一步学习资源 SQlite - 标签 - likebeta - 博客园 一、源码获取 SQLite Do…

贪心法

贪心法的证明 —归纳证明&#xff1a; —贪心法使用的条件是&#xff1a;最优子结构和贪心选择正确性 —贪心算法是一步一步实现的&#xff0c; —在归纳证明的时候&#xff0c;贪心的第一步贪心选择策略的正确性就是归纳基础&#xff0c;因为以后都是一个子问题的选取&#xf…

第一季5:Hi3518EV200的环境搭建

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、内容总结 本文讲述如何安装交叉编译工具链&#xff0c;与编译源码得到uboot、kernel、rootfs镜像文件。 &#xff08;1&#xff09;安装交叉编译工具链&#xff0c;主要是通过执行osdrv/opensou…

Android动画的实现 上

在Android系统中也能经常见到动画&#xff0c;那么如何实现动画效果呢&#xff1f;本文就来为大家介绍动画的实现方式。 Android中动画的实现分两种方式&#xff0c;一种方式是补间动画Tween Animation&#xff0c;就是说你定义一个开始和结束&#xff0c;中间的部分由程序运算…

第一季2:HI3518EV200的初体验(检测板子是否正常工作)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、检测步骤 1、设置PC主机有线网卡的ip地址设为192.168.1.10&#xff0c;关闭防火墙。 2、虚拟机桥接到有线网卡&#xff0c;并设置虚拟机的静态ip地址为192.168.1.141。 3、在uboot控制台设置ub…

第一季3:HI3518E方案整体架构介绍(硬件和软件支持)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、硬件资源 &#xff08;1&#xff09;HI3518E单芯片提供&#xff1a;CPU DSP 内置64MB DDR ETHERNET MAC。 &#xff08;2&#xff09;外置16MB的SPI接口的Flash用来存放程序&#xff08;ubo…

(一)FlexViewer之整体框架解析

文章版权由作者李晓晖和博客园共有&#xff0c;若转载请于明显处标明出处&#xff1a;http://www.cnblogs.com/naaoveGIS/。 1.FlexViewer简介 FlexViewer框架为Esri提供的可以高效开发基于WEB的地理信息应用系统的一种完全免费的应用程序框架。目前有两种版本&#xff0c;一种…

三阶魔方复原操作方法

在女票的指导下&#xff0c;我花了一个晚上学习如何复原三阶魔方&#xff0c;虽然是知其然不知其所以然&#xff0c;但好歹也能把魔方复原了。下面都是一些傻瓜式的操作&#xff0c;里面涉及的理论我不清楚。魔方总共分三层&#xff0c;下面是每层复原方法。 第一层 1、先以“…