1.php.ini配置文件
如果要在PHP中实现小文件的上传(2MB以下),那么无需对php.ini配置文件进行修改,使用默认参数即可。但如果想实现完美的上传功能,则一定要对配置文件有所了解。首先来看一下图。
从图中可以看到,有3部分内容需要进行配置。首先来看第1部分。
1.Resource Limits
Resource Limits,直译过来就是资源限制,包含了3个参数。该区块不仅仅是针对上传下载的,而是对全部的文件进行设置。各个参数含义及参数值说明如表1所示。
表1 Resource Limits块的参数说明
参 数 |
说 明 |
max_execution_time |
每个脚本页面完成执行操作的最大时间,单位是秒。如果设为−1,说明没有限制 |
max_input_time |
每个脚本页面处理请求数据的最大时间,单位是秒,也可以设为−1 |
memory_limit |
一个脚本页所能够消耗的最大内存 |
2.post_max_size
post_max_size参数指PHP通过表单POST所能接收的最大值,包括表单里的所有项。
3.File Uploads
File Uploads块是专为文件上传设置的。该区块中同样包含了3个参数。参数含义及参数值说明如表2所示。
表2 File Uploads块的参数说明
参 数 |
说 明 |
file_uploads |
是否允许HTTP上传,默认为On,即为开启,无需修改 |
upload_tmp_dir |
文件上传时的临时存储目录。如果没指定就会用系统默认的临时文件夹 |
upload_max_filesize |
允许上传的文件的最大值 |
2.文件上传表单
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="test.php" method="post" enctype="multipart/form-data"> 单个文件上传<br/> <input type="file" name="filename"/> <input type="submit" value="enter"><br/> 多个文件上传<br/> <input type="file" name="userfile[]"/> <input type="file" name="userfile[]"/> <input type="submit" value="上传"/> <!-- 给一个隐藏域限制上传文件的大小 --> <input type="hidden" name="max_file_size" value="1024000"> </form> </body> </html>
3.文件上传数据处理
如果表单设计的没有问题,那么在处理页中,使用$_FILES预定义变量就可以得到上传文件的相关信息。反之,如果得不到,那么就有可能是配置文件或表单设置的问题了。稍后会介绍上传的常见错误及原因。下面先介绍预定义变量$_FILES。
$_FILES变量存储的是上传文件的相关信息,这些信息对于上传功能有很大作用。该变量是一个二维数组,保存的信息如表3所示。
表3 $_FILES变量值
元 素 名 |
说 明 |
$_FILES[filename]['name'] |
存储了上传文件的文件名。例如:exam.txt、myDream.jpg等 |
$_FILES[filename]['size'] |
存储了文件大小。单位为字节 |
$_FILES[filename]['tmp_name'] |
文件上传时,首先在临时目录中被保存成一个临时文件。该变量为临时文件名 |
$_FILES[filename]['type'] |
上传文件的类型。注意是类型,不是后缀 |
$_FILES[filename]['error'] |
存储了上传文件的错误代码 |
error字段将返回上传文件的错误码,一共有7种状态。状态代码及说明如表4所示。
表4 $_FILES[filename]['eror']中的错误代码及说明
错 误 代 码 |
错 误 说 明 |
0 |
UPLOAD_ERR_OK。上传成功,无错误 |
1 |
UPLOAD_ERR_INI_SIZE。上传文件大小超出php.ini中的upload_max_filesize的参数值 |
2 |
UPLOAD_ERR_FORM_SIZE。上传文件大小超出表单中MAX_FILE_SIZE隐藏域的值 |
3 |
UPLOAD_ERR_PARTIAL。文件没有被全部上传 |
4 |
UPLOAD_ERR_NO_FILE。没有文件被上传 |
6 |
UPLOAD_ERR_NO_TMP_DIR。找不到临时文件目录 |
7 |
UPLOAD_ERR_CANT_WRITE。文件写入失败 |
<?php header("Content-type: text/html; charset=utf-8"); // 文件上传 $tmparr=$_FILES['filename'];//获取上传文件信息 if($tmparr['name']!=''){ foreach($tmparr as $name=>$value){//循环输出数组索引和值 echo $name.'=>'.$value.'<br>'; } }else{ echo "<script>alert('请添加上传文件')</script>"; } //上传文件函数 if($tmparr['error']==0){//上传成功 if(is_uploaded_file($tmparr['tmp_name'])){//判断是不是post上传文件 if(true==move_uploaded_file($tmparr['tmp_name'], $tmparr['name'])){ echo "上传成功"; }else{ echo "<script>alert('文件不合法');history_go(-1);</script>"; } }else{ echo "<script>alert('非法操作');history_go(-1);</script>"; } }else{//上传失败 echo "<script>alert('上传错误,错误类型:".$tmparr['error']."');history_go(-1);</script>"; }
打印$_FILES
4.文件下载
1.通过链接下载
通过链接下载,就是将文件的相对路径或绝对路径直接作为超链接即可。如果是压缩文件,那么直接单击超链接就可以下载;对于文本文件,单击鼠标右键,选择“目标另存为”命令,就可以将文本文件下载下来。所有格式的文件,都可以通过这种方法下载下来。下面是一个实例,代码如下:
要下载聊天室模块源码,请点击<ahref= "../14.rar">这里</a>
2.通过header()函数下载
header()函数属于HTTP函数,它的作用是发送一个原始的HTTP标头。header()函数的语法格式如下:
void header ( string string [, bool replace [, int http_response_code]] )
参数说明如下:
string:发送的标头。
replace:如果一次发送多个标头,指明相似的标头是替换还是添加。如果是False,则强制发送多个同类型标头。默认是True,即替换。
http_response_code:强制HTTP响应为指定值。
HTTP标头有很多,这里只介绍下载,其他请参考相关资料。下载HTTP标头的代码如下:
header('Content-Disposition: attachment; filename="filename"');
上面的代码中惟一需要改动的就是filename。将filename替换为要下载的文件就可以了。
在下面的实例中,如果用户单击“同意”按钮,将会调用down()函数并跳转到test.php页中,如果用户单击“不同意”按钮,页面将关闭。代码如下:
<div style="padding: 15px; 300px;height: 50px;border: 1px #000000 solid;"> 协议条款<br/> ...<br/> ... ...<br/> <button onclick="down('./ff6.png')">同意</button> <button onclick="closeme()">不同意</button> </div> <div style="padding: 5px;">如果你想下载该文件,请详细阅读上面的服务条框。你同意后可以下载</div> <script> function down(name){ location='test.php?act=true&name='+name; } function closeme(){ window.opener=null; window.close(); } </script>
处理页代码
<?php if($_GET['act'] == true){ header('Content-type: application/octet-stream'); //设置HTTP标头 header('Content-Disposition: attachment; filename="'.$_GET['name'].'"'); readfile('../'.$_GET['name']); //读取文件 } ?>