PHP中上传多个文件到服务器例子
实例说明
上传图片到服务器,是程序开发过程中必不可少的一个功能。它不但可以达到图片共享的目的,而且可以提高网站的访问量,丰富网站的内容。在本实例中,讲解如何通过POST方式实现多图片上传。
关键技术
多文件上传的关键是如何定义上传文件元素的名称及如何判断上传文件的数量。在本实例中,以数组的形式定义上传文件的名称(上传文件的名称是“files[]”)。为了达到可以上传任意数量图片(4个图片以内)的目的,在对上传文件进行处理的过程中应用array_filter()函数和回调函数去除数组中的空元素。
array_filter()函数,用回调函数过滤数组中的单元,语法如下:
array array_filter(array input[,callback callback])
array_filter()函数依次将input数组中的每个值传递到callback函数。如果callback函数返回TRUE,则input数组的当前值会被包含在返回的结果数组中,并且数组的键名保留不变。
说明:在回调函数中不要对数组进行修改操作,例如,增加或者删除数组中的元素,如果一旦数组改变,那么此函数的运用也就没有意义了。如果没有提供callback()函数,array_filter()将删除input中所有等值为FALSE的元素。
本实例中定义的回调函数是check(),用于验证数组中的元素值是否为空,其语法如下:
代码如下 | 复制代码 |
function check($var){//验证数组的返回值是否为空 return($var!=""); } |
设计过程
(1)创建index.php文件。添加表单,设置文件域、提交按钮,使用POST方法,设置enctype="multipart/form-data",将数据提交到index_ok.php页,完成多个文件的上传操作,其关键代码如下:
代码如下 | 复制代码 |
<table width="750"border="0"cellspacing="0"cellpadding="0"> <form action="index_ok.html"method="post"enctype="multipart/form-data"name="form1"> <tr> <td width="100"height="25"align="right"class="STYLE1">内容1:</td> <td width="150"align="center"><input name="files[]"type="text"id="files[]"size="15"></td> <td align="left"><input name="picture[]"type="file"id="pcture[]"size>="30"></td> </tr> <tr> <td height="25"align="right"class="STYLE1">内容2:</td> <td width="center"><input name="files[]"type="text"id="files[]"size="15"></td> <td align="left"><input name="picture[]"type="file"id="pcture[]"size>="30"></td> </tr> <tr> <td colspan="3"align="center"> <input type="image"name="imageField"src="images/bg_09.jpg"> <input type="image"name="imgeField2"src="images/bg_11.jpg"></td> </tr> </form> </table> |
(3)创建index.php文件获取表单中提交的数据,将多个文件存储到服务器中,将文件的名称和存储路径存储到数据库中,其代码如下:
代码如下 | 复制代码 |
<?php header("Content-type:text/html;charset=UTF-8"); //设置文件编码格式 include"conn/conn.php"; //包含数据库链接文件 if($_POST[files]!=""){ if(! is_dir("./upfile")){ mkdir("./upfile");//创建上传文件存储文件夹 } $data=date("Y-m-d H:m:s");//定义时间 function check($var){ //验证数组的返回值是否为空 return($var!="");//如果不为空则返回数组元素 } $files=array_filter($_POST["files"],"check");//去除数组中空值 $array=array_filter($_FILES["picture"]["name"],"check"); //去除数组中空值 foreach=($aarray as $key=>value){ //循环读取数组中数据 $path='upfile/'.time().$key.strtolower(strstr($value,".")); //定义上传文件存储位置 move_uploaded_file($_FILES["picture"]["tmp_name"][$key],$path);//执行上传操作 $query="insert into tb_up_file(file_test,data,file_name)values('$path','$data''$files[$key]')"; $result=mysql_query($query); } echo"<script> alert('图片上传成功');window.location.href='index.html';</script>"; } >? |
秘笈心法
通过伪静态技术隐藏PHP文件后缀。
首先,修改Apache服务器的配置文件httpd.conf。打开httpd.conf文件,定位到如下位置:
代码如下 | 复制代码 |
#LoadModule rewrite_module modules/mod_rewrite.so |
将该项前面的“#”去掉后启动该项。
然后,查找httpd.conf文件,找到其中的AllowOverride项,将它的值都修改为All。保存并重新启动Apache服务器,使修改生效。
最后,在实例根目录下创建.htaccess文件,实现对PHP文件后缀的隐藏操作。.htaccess文件的代码如下:
代码如下 | 复制代码 |
RewriteEngine On#启动项 RewriteRule^index.html$ index.php RewriteRule^ndex_ok.html$ index_ok.php RewriteRule^index-([0-9]+)-([0-9]+)-([0-9]+)\.html$ index.php?vv=$1&ljjl=$2&page=$3[L] |
代码如下 | 复制代码 |
通过正则表达式对文件的后缀和传递的参数进行匹配,完成对PHP文件后缀的隐藏操作。
静态化页面的好处就不说了,现在我们下文要介绍的实现方法就是利用定义的模板页面和标签然后再利用php读取模板页面之后进入分析替换就可以了,具体我们来看两个例子。方案:使用模板替换技术(没有时间延迟)
代码如下 | 复制代码 |
/* //5.文件必须关闭 //news.tpl模板文件 |
方案:如果静态文件存在,且生成时间30秒内,直接返回静态页面(有时间延迟)
代码如下 | 复制代码 |
/* //1.主要代码 //这里也可以使用DB工具类 |
从上面看我们头一种生成静态页面的方法更合适于页面的后期维护哦,后者是比较难维护的哦,推荐使用第一种办法。
以前人记得我有介绍过在php中CLI模式传参数的几个方法,下面我再来给大家详细的介绍一下关于CLI模式传参数的例子,希望例子能帮助到各位。
在CLI(命令行界面 Command Line Interface)传入参数呢的3种方法。
一. getopt函数(PHP 4 >= 4.3.0, PHP 5)
建立文件:test1.php 代码如下
<?php
$opt= getopt('m:n:');
print_r($opt);
?>
然后运行命令
php test1.php -maaaaaa -nbbbbbbb
结果如下:
array(
[m] => aaaaaa
[n] => bbbbbbb
)
详情请看手册 :http://www.php.net/manual/zh/function.getopt.php
二. $argv
建立文件:test2.php 代码如下
<?php
var_dump($argv);
?>
然后运行命令
php test2.php 1 2 3 a b c
结果如下:
array(7){
[0]=>string(9) “test2.php”
[1]=>string(1) “1″.
[2]=>string(1) “2″
[3]=>string(1) “3″
[4]=>string(1) “a”
[5]=>string(1) “b”
[6]=>string(1) “c”
}
详情参见手册:http://www.php.net/manual/zh/reserved.variables.argv.php
三. STDIN
建立文件:test3.php 代码如下
<?php
fwrite(STDOUT, "Enter your name: ");
$name = trim(fgets(STDIN));
fwrite(STDOUT, "Hello, $name!");
?>
然后运行命令
php test3.php
结果如下:
此时屏幕输出:Enter your name:
我们在后面输入:111cn.net然后回车
此时屏幕会出现Hhellow,111cn.net
传值:是把实参的值赋值给行参 ,那么对行参的修改,不会影响实参的值
传引用 :真正的以地址的方式传递参数传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值
代码如下 | 复制代码 |
$b=1; //定义变量2 $1= &$b; //将变量2的引用传给变量1 echo $b.'<br />'; //显示为1 echo $a; $a= 2; //把2赋值给变量1 echo $b; //显示为2 |
一,php实例
1,传值
. 代码如下:
代码如下 | 复制代码 |
<?php |
2,传引用
. 代码如下:
代码如下 | 复制代码 |
<?php |
3,函数传值
. 代码如下:
代码如下 | 复制代码 |
<?php |
4,函数传引用
. 代码如下:
代码如下 | 复制代码 |
<?php |
5,函数传引用2
. 代码如下:
代码如下 | 复制代码 |
<?php |
我们在玩星际任务版或者单机与电脑对战的时候,有时候会突然要离开游戏,或者在出兵前面,需要存储一下游戏。
那么我们通过什么办法来保存目前的信息呢?而且在任何时候,可以恢复保存的游戏呢?
待解决的问题:保存游戏的一切信息,如果恢复的时候完全还原。
思路:建立一个专门保存信息的类,让他来处理这些事情,就像一本备忘录。
为了简单,我们这里用恢复一个玩家的信息来演示。
代码如下 | 复制代码 |
//备忘类 class Memento { //水晶矿 public $ore; //气矿 public $gas; //玩家所有的部队对象 public $troop; //玩家所有的建筑对象 public $building; //构造方法,参数为要保存的玩家的对象,这里强制参数的类型为Player类 public function __construct(Player $player) { //保存这个玩家的水晶矿 $this->ore = $player->ore; //保存这个玩家的气矿 $this->gas = $player->gas; //保存这个玩家所有的部队对象 $this->troop = $player->troop; //保存这个玩家所有的建筑对象 $this->building = $player->building; } } //玩家的类 class Player { //水晶矿 public $ore; //气矿 public $gas; //玩家所有的部队对象 public $troop; //玩家所有的建筑对象 public $building; //获取这个玩家的备忘对象 public function getMemento() { return new Memento($this); } //用这个玩家的备忘对象来恢复这个玩家,这里强制参数的类型为Memento类 public function restore(Memento $m) { //水晶矿 $this->ore = $m->ore; //气矿 $this->gas = $m->gas; //玩家所有的部队对象 $this->troop = $m->troop; //玩家所有的建筑对象 $this->building = $m->building; } } //制造一个玩家 $p1 = new Player(); //假设他现在采了100水晶矿 $p1->ore = 100; //我们先保存游戏,然后继续玩游戏 $m = $p1->getMemento(); //假设他现在采了200水晶矿 $p1->ore = 200; //我们现在载入原来保存的游戏 $p1->restore($m); //输出水晶矿,可以看到已经变成原来保存的状态了 echo $p1->ore; |
用途总结:备忘模式使得我们可以保存某一时刻为止的信息,然后在需要的时候,将需要的信息恢复,就像游戏的保存和载入归档一样。
实现总结:需要一个备忘类来保存信息,被保存的类需要实现生成备忘对象的方法,以及调用备忘对象来恢复自己状态的方法。
相关文章
- 下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
Jupyter Notebook读取csv文件出现的问题及解决
这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06- 有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
- C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
- 这篇文章主要为大家详细介绍了js实现上传图片及时预览的相关资料,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-05-09
php无刷新利用iframe实现页面无刷新上传文件(1/2)
利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25- 本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
- 要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
- 又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
- 本文实例讲述了jQuery实现文件上传进度条效果的代码。分享给大家供大家参考。具体如下: 运行效果截图如下:具体代码如下:<!DOCTYPE html><html><head><meta charset="utf-8"><title>upload</title><link rel="stylesheet...2015-11-24
- 今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
- 这篇文章主要介绍了C#路径,文件,目录及IO常见操作,较为详细的分析并汇总了C#关于路径,文件,目录及IO常见操作,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
- 这篇文章主要介绍了C#使用StreamWriter写入文件的方法,涉及C#中StreamWriter类操作文件的相关技巧,需要的朋友可以参考下...2020-06-25
ant design中upload组件上传大文件,显示进度条进度的实例
这篇文章主要介绍了ant design中upload组件上传大文件,显示进度条进度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-29