PHP上传文件示例程序代码(适合初学者)
创建一个文件上传表单
允许用户从表单上传文件是非常有用的。
请看下面这个供上传文件的 HTML 表单:
代码如下 | 复制代码 |
<html> <form action="upload_file.php" method="post" enctype="multipart/form-data"> </body> |
请留意如下有关此表单的信息:
<form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。
<input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。
创建上传脚本
"upload_file.php" 文件含有供上传文件的代码:
代码如下 | 复制代码 |
|
通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。
第一个参数是表单的 input name(表单file组件的name值),第二个下标可以是 "name", "type", "size", "tmp_name" 或 "error"。就像这样:
$_FILES["attach_file"]["name"] - 被上传文件的名称
$_FILES["attach_file"]["type"] - 被上传文件的类型
$_FILES["attach_file"]["size"] - 被上传文件的大小,以字节(b)为单位
$_FILES["attach_file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
$_FILES["attach_file"]["error"] - 由文件上传导致的错误代码
这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关什么用户有权上传文件的限制。
上传限制
在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif 或 .jpeg 文件,文件大小必须小于 20 kb:
代码如下 | 复制代码 |
<?php if ((($_FILES["attach_file"]["type"] == "image/gif") || ($_FILES["attach_file"]["type"] == "image/jpeg") || ($_FILES["attach_file"]["type"] == "image/pjpeg")) && ($_FILES["attach_file"]["size"] < 20000)) { ?> |
注释:对于 IE,识别 jpg 文件的类型必须是 pjpeg,对于 FireFox,必须是 jpeg。
保存被上传的文件
上面的例子在服务器的 PHP 临时文件夹创建了一个被上传文件的临时副本。
这个临时的复制文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:
代码如下 | 复制代码 |
<?php if ((($_FILES["attach_file"]["type"] == "image/gif") || ($_FILES["attach_file"]["type"] == "image/jpeg") || ($_FILES["attach_file"]["type"] == "image/pjpeg")) && ($_FILES["attach_file"]["size"] < 20000)) { if ($_FILES["attach_file"]["error"] > 0) { echo "Return Code: " . $_FILES["attach_file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["attach_file"]["name"] . "<br />"; echo "Type: " . $_FILES["attach_file"]["type"] . "<br />"; echo "Size: " . ($_FILES["attach_file"]["size"] / 1024) . " Kb<br />"; echo "Temp file: " . $_FILES["attach_file"]["tmp_name"] . "<br />"; if (file_exists("upload/" . $_FILES["attach_file"]["name"])) { echo $_FILES["attach_file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["attach_file"]["tmp_name"], "upload/" . $_FILES["attach_file"]["name"]); echo "Stored in: " . "upload/" . $_FILES["attach_file"]["name"]; } } } else { echo "Invalid file"; } ?> |
上面的脚本检测了是否已存在此文件,如果不存在,则把文件拷贝到指定的文件夹。
注意:这个例子把文件保存到了名为 "upload" 的新文件夹。
上传文件大小限制大全
在php.ini里面可以设置最大上传文件大小
解决方法:
第一:
在php.ini里面查看如下行:
upload_max_filesize = 8M
post_max_size = 10M
memory_limit = 20M
另外要确认上传的 <form> 里类似下面的这行
<input type="hidden" name="MAX_FILE_SIZE" value="500000">
第二:
如果是apache 2 需要修改
view sourceprint?1 /etc/httpd/conf.d/php.conf
中的LimitRequestBody 524288将524288(=512×1024)改大,比如5M(=5×1024×1024)
另外:PHP的最大执行时间也是可能影响的因素。
也可通过php文件临时设置,代码如下:
代码如下 | 复制代码 |
<?php |
打开php.ini,首先找到
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;
区域,有影响文件上传的以下几个参数:
file_uploads = on ;是否允许通过HTTP上传文件的开关。默认为ON即是开
upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
upload_max_filesize = 200m ;望文生意,即允许上传文件大小的最大值。默认为2M
在
;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;;
区域,还有一项:
post_max_size = 100m ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M
一般地,设置好上述四个参数后,上传<=8M的文件是不成问题,在网络正常的情况下。
但如果要上传>8M的大体积文件,只设置上述四项还一定能行的通。除非你的网络真有100M/S的上传高速,否则你还得关心关心下面的参数:
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;
max_execution_time = 600 ;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit = 8m ;每个PHP页面所吃掉的最大内存,默认8M
把上述参数修改后,在网络所允许的正常情况下,就可以上传大体积文件了。
好了,设置好现在就可以一试。点击一200大M的文件上传一下
在你听歌、想MM或上厕所回来过程中,程序会告诉你上传成功啦~
在本机上测试上传200M的文件成功。
工作中的一次配置:
代码如下 | 复制代码 |
upload_max_filesize 300M |
补充说明:需要保持 memory_limit > post_max_size > upload_max_filesize
在php中如果我们要获取汉字的拼音第一个字母我们先要了解asc码的范围码了,我们只要知道这个值上下限就可以使用php中的ord来获取我相关的汉字拼音了。实例1
代码如下 | 复制代码 |
function getFirstCharter($str) { 例如: echo getFirstCharter("程序员3aj.cn"); // 结果将输出:C |
实例二
代码如下 | 复制代码 |
<?php $limit=array( //gb2312 拼音排序 array(45217,45252), //A array(45253,45760), //B array(45761,46317), //C array(46318,46825), //D array(46826,47009), //E array(47010,47296), //F array(47297,47613), //G array(47614,48118), //H array(0,0), //I array(48119,49061), //J array(49062,49323), //K array(49324,49895), //L array(49896,50370), //M array(50371,50613), //N array(50614,50621), //O array(50622,50905), //P array(50906,51386), //Q array(51387,51445), //R array(51446,52217), //S array(52218,52697), //T array(0,0), //U array(0,0), //V array(52698,52979), //W array(52980,53688), //X array(53689,54480), //Y array(54481,55289), //Z ); $str="A:这是一个测试程序1"; $str= iconv("UTF-8","gb2312", $str); echo $str."</br>"; $i=0; while($i<strlen($str) ) { $tmp=bin2hex(substr($str,$i,1)); if($tmp>='B0'){ //汉字的开始 $t=getLetter(hexdec(bin2hex(substr($str,$i,2)))); printf("%c",$t==-1 ? '*' : $t ); $i+=2; } else{ printf("%s",substr($str,$i,1)); $i++; } } function getLetter($num){ global $limit; $char_index=65; foreach($limit as $k=>$v){ if($num>=$v[0] && $num<=$v[1]){ $char_index+=$k; return $char_index; } } return -1; } ?> |
很不习惯PHP中的变量作用域,PHP中函数变量和全局是完全隔绝的,也就是无法相互访问。
比如下面这样:
copytext
代码如下 | 复制代码 |
$test = 123; abc(); //这里什么都不输出,因为访问不到$test变量 abc(); //这里什么都不输出,因为访问不到$test变量 |
}如果,你想在函数内部访问外部变量,你需要这样:
copytext
代码如下 | 复制代码 |
$test = 123; abc(); //输出123 abc(); //输出123 |
但如果我们在函数中定义全局变量呢,像下面这样:
copytext
代码如下 | 复制代码 |
function abc(){ global $test; $test = 123; } abc(); echo($test); //输出123function abc(){ global $test; $test = 123; } abc(); echo($test); |
//输出123通过这种方式,我们可以在外部访问到函数内部定义的变量
在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内(包括include 和 require 导入的文件内的变量)!
解释:A.php文件的内Test_Global是定义好的第三方函数,该函数用include导入了B.php文件内的$a的global全局变量,所以$a被限制在Test_Global局部函数范围内,所以B.php文件内的$a的作用范围都在Test_Global内,而不是作用了整个A.php内….
解决方案:
1. 冲出局部函数
//A.php 文件
代码如下 | 复制代码 |
<?php //B.php 文件 <?php |
2.优秀的访问器
代码如下 | 复制代码 |
//A.php 文件 //B.php 文件 <?php |
1. 获取地址
这个功能最主要的就是用正则表达式来匹配页面源码里的图片地址了,这里用到得正则表达式是:
代码如下 | 复制代码 |
/<img.*src="(.*)"\s*.*>/iU |
首页通过PHP自带的读取文件函数来获得请求页面的html代码,然后用正则表达式来匹配里面的src地址,这里有两个注意点:
■file_get_content
只能获取到静态的页面内容,也就是说如果你在页面里看到的是图片是通过Javascript来展示的,通过这个工具是获取不到图片信息的
■有的网站对file_get_content 这个函数做了些限制,如果不是通过浏览器打开的网页,服务器是拒绝请求的,这个时候我们就需要给php 程序添加一个配置信息,让采集的程序能够模拟一个留言器的UA(user agent),具体的做法可以通过下面的代码来实现://现在模拟的是一个Window 环境下的浏览器
ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; 4399Box.560; .NET4.0C; .NET4.0E)');
通过以上两点的处理,获取网页源码就没有问题了,唯一要做的就是用正则表达式对图片地址的匹配。
例子1
代码如下 | 复制代码 |
/** |
可能有些朋友也知道file_get_contents性能不怎么样,我们可使用curl来获取
代码如下 | 复制代码 |
|
在网站的管理后台经常会使用到报表的生成和读取,CSV和Excel都是常用的报表格式,CSV相对来说比较简单,如果大家有疑问我会相继发布一些CSV的实例,这里主要介绍用PHP 来生成和读取Excel文件。
要执行下面的函数,首先要引入一个类库:PHPExcel,PHPExcel是一个强大的PHP类库,用来读写不同的文件格式,比如说Excel 2007,PDF格式,HTML格式等等,这个类库是建立在Microsoft's OpenXML和PHP 的基础上的,对Excel提供的强大的支持,比如设置工作薄,字体样式,图片以及边框等等,下面来看看它是如何读写Excel文件的:
首先来看如果生成Excel文件:
下面这代码中函数arrayToExcel的功能是把一个二维数组的数据生成一个excel文件,并且保存在服务器上。
代码如下 | 复制代码 |
require_once 'Classes/PHPExcel/Reader/Excel2007.php'; require_once 'Classes/PHPExcel/Reader/Excel5.php'; include 'Classes/PHPExcel/IOFactory.php'; function arrayToExcel($data){ $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel->getActiveSheet()->setTitle('firstsheet'); $objPHPExcel->getDefaultStyle()->getFont()->setName('Arial'); $objPHPExcel->getDefaultStyle()->getFont()->setSize(10); //add data $i = 2; foreach ($data as $line){ $objPHPExcel->getActiveSheet()->setCellValue('A'.$i, $line['From']); $objPHPExcel->getActiveSheet()->getCell('A'.$i)->setDataType('n'); $objPHPExcel->getActiveSheet()->setCellValue('B'.$i, $line['To']); $objPHPExcel->getActiveSheet()->getCell('B'.$i)->setDataType('n'); $i++; } $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $file = 'excel.xls'; $objWriter->save($file); } |
如果你不希望保存在服务器上,希望生成以后直接下载到客户端,可以在输出文件的时候加入下面的代码,而不使用 $objWriter->save($file);
代码如下 | 复制代码 |
header("Pragma: public"); |
接下来看一个读取Excel文件内容的实例:
下面这代码中函数excelToArray的功能是把一个excel里的内容重新整理放到一个数组了。
代码如下 | 复制代码 |
require_once 'Classes/PHPExcel.php'; require_once 'Classes/PHPExcel/IOFactory.php'; function excelToArray($file){ $objReader = PHPExcel_IOFactory::createReader('Excel5'); $objReader->setReadDataOnly(true); $objPHPExcel = $objReader->load($file); $objWorksheet = $objPHPExcel->getActiveSheet(); $highestRow = $objWorksheet->getHighestRow(); $highestColumn = $objWorksheet->getHighestColumn(); $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); $excelData = array(); for ($row = 2; $row <= $highestRow; ++$row) { for ($col = 0; $col <= $highestColumnIndex; ++$col) { $excelData[$row][] = $objWorksheet->getCellByColumnAndRow($col, $row)->getValue(); } } return $excelData; } |
精简办法
代码如下 | 复制代码 |
<?php /** * * @copyright 2007-2012 Xiaoqiang. * @author Xiaoqiang.Wu <jamblues@gmail.com> * @version 1.01 */ error_reporting(E_ALL); date_default_timezone_set('Asia/ShangHai'); /** PHPExcel_IOFactory */ require_once '../Classes/PHPExcel/IOFactory.php'; // Check prerequisites if (!file_exists("31excel5.xls")) { exit("not found 31excel5.xls.n"); } $reader = PHPExcel_IOFactory::createReader('Excel5'); //设置以Excel5格式(Excel97-2003工作簿) $PHPExcel = $reader->load("31excel5.xls"); // 载入excel文件 $sheet = $PHPExcel->getSheet(0); // 读取第一??工作表 $highestRow = $sheet->getHighestRow(); // 取得总行数 $highestColumm = $sheet->getHighestColumn(); // 取得总列数 /** 循环读取每个单元格的数据 */ for ($row = 1; $row <= $highestRow; $row++){//行数是以第1行开始 for ($column = 'A'; $column <= $highestColumm; $column++) {//列数是以A列开始 $dataset[] = $sheet->getCell($column.$row)->getValue(); echo $column.$row.":".$sheet->getCell($column.$row)->getValue()."<br />"; } } ?> |
相关文章
- 下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
Jupyter Notebook读取csv文件出现的问题及解决
这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06- 有一种方法,可以不打开网站而直接查看到这个网站的源代码.. 这样可以有效地防止误入恶意网站... 在浏览器地址栏输入: view-source:http://...2016-09-20
- 有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
- <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
- 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基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
- 本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
- 本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
- php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
php无刷新利用iframe实现页面无刷新上传文件(1/2)
利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25- php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p> </p> <p> </p> <form name="form1...2016-11-25
- 公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
- 要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
- 又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
- 本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
- 今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14