PHP 文件上传

■ PHP 文件上传
 
在PHP中实现上传文件相对简单。因为常用的WEB功能在PHP中都已经被封装好。
 
一、PHP 文件上传过程:
 
① 当在浏览器中选择好文件并提交后,文件会被自动发送到服务器上,形成一个临时文件(拥有一个临时的文件名,例如:php310.tmp),并被存放在一个临时的目录中(这个过程PHP已经为你封装好,不需要你操心)
 
② 在服务器上,我们只需要把临时文件移动到自己想要的位置就可以完成文件上传的操作了。(这个操作要使用到 PHP的目录操作函数)
 
 
二、文件上传之表单项:
 
注意:
① 表单的提交数据方式必须用 POST(即 method="POST"),不能用 GET ;
 
② <form>标签中需要额外加上一个属性 enctype,该属性规定了在提交表单时要使用哪种内容类型。在表单需要提交 二进制数据 时,比如文件内容,该属性的值应为 multipart/form-data(即 enctype="multipart/form-data");
 
③ 提交文件的 <input>标签 的一般形式为:
<input type="file" name="$_FILES中的键名" />
 
例如:
<form action="upload.php" method="POST" enctype="multipart/form-data">
图片:<input type="file" name="img01" /><br />
<input type="submit" value="上传" />
</form>
 
 
三、文件上传之 $_FILES 变量:
 
在服务器端,我们通过 预定义变量(超级全局变量) $_FILES 接收并处理上传的文件。
 
$_FILES 是一个二维数组,它的每个元素代表一个文件的信息。每个文件的信息也是一个数组,每个文件信息的数组都有以下元素:
 
键名: 介绍:
['name'] 代表上传文件的文件名;
['type'] 代表上传文件的类型;
['tmp_name'] 代表文件发送到服务器后形成的临时文件的路径;
['error'] 代表错误代码;
['size'] 代表上传文件的大小(字节)。
 
 
四、文件上传之 PHP 处理:
 
在服务器端,我们对上传文件的主要操作就是把临时文件移动到想要保存的目录下。这里,我们主要依赖于一个PHP系统函数:
 
move_uploaded_file(上传文件的临时文件的路径,要转移的目的路径) 
 
注意:如果目标文件已经存在,将会被覆盖。
 
例如:
move_uploaded_file($_FILES['键名']['tmp_name'],'./upload/'.$_FILES['键名']['name']);
 
 
五、配置文件上传的临时目录:
 
在 php.ini 中找到 upload_tmp_dir ;
如果把这个语句注释了(即 在前面加上分号),系统将会把上传文件的临时文件保存在操作系统的临时目录下。
 
☆提示:
q:上传文件的临时文件什么时候会被删除?
a:当接收表单数据的 .php 文件执行结束,这个上传文件的临时文件就会被自动删除。
 
 
六、文件上传 必须注意的问题:
 
① 分目录存储上传的文件(例如 按日期建立目录)。
② 重命名上传的文件,以防止文件重名(随机字符+文件后缀)。
③ 限制上传文件的大小。
 
 
七、限制上传文件的相关配置:
 
在 php.ini 中分别找到以下配置项:
 
file_uploads 设定是否允许 http 文件上传。
upload_max_filesize 设定所上传的文件的最大字节数。
max_file_uploads 设定一个表单中最多的上传文件个数。
post_max_size 设定表单通过 POST 方式提交数据所允许的最大字节数。
upload_tmp_dir 设定存放上传文件的临时文件的临时目录。
memory_limit 设定最大脚本占用内存。
max_execution_time 设定脚本最大执行时间。
 
 
八、错误代码说明:
 
0,没有错误发生,文件上传成功。
1,上传的文件超过了 php.ini 中 upload_max_filesize 限制的值。
2,上传的文件超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
3,文件只有部分被上传。
4,没有文件被上传。
6,找不到上传文件的临时文件夹。
7,文件写入失败。
注意:没有 5 。
 
九、上传文件 与 数据库:
 
当完成文件上传的所有操作后(即 转移上传文件的临时文件后),数据库中应该保留什么与该文件相关的信息呢?
 
我们应该将 上传文件相对于网站根目录的相对路径 保存在数据库的相关字段中。当需要使用该上传文件时,我们可以从相应字段取出上传文件所在的路径,再根据路径取得文件。
 
 
十、多文件上传 之 无限数量上传:
 
表单域内容:
<form action="#" method="POST" enctype="multipart/form-data">
<input type="file" name="arrfiles[]" /><br />
<input type="file" name="arrfiles[]" /><br />
<input type="file" name="arrfiles[]" /><br />
<input type="submit" value="提交" />
</form>
 
  ★注意:
① <input>标签中的 name 属性的值必须要加上 [] ;
② 无限数量的多文件上传与一般的多个文件上传不同,在接收表单信息的.php中 $_FILES 成为了 三维数组 ,其内容大概如下:
 
Array
(
[arrfiles] => Array
(
[name] => Array
(
[0] => x01.jpg
[1] => x02.jpg
[2] => x03.jpg
)
[type] => Array
(
[0] => image/jpeg
[1] => image/jpeg
[2] => image/jpeg
)
[tmp_name] => Array
(
[0] => D:\temp\php10E.tmp
[1] => D:\temp\php10F.tmp
[2] => D:\temp\php110.tmp
)
[error] => Array
(
[0] => 0
[1] => 0
[2] => 0
)
[size] => Array
(
[0] => 1001
[1] => 1956
[2] => 6333
)
)
)
 
在处理表单的多文件上传时,我们应该首先获得文件的数量,实现代码如下:
 
$files = $_FILES['arrfiles']; // 将三维数组 减少一维(一层)。 
 
/********************************************************
通过 PHP 系统内置函数 count() 获得数组的元素数量。
目的:获得上传文件的数量
注意:是 $files 的元素 中的元素数量,不是 $files 的元素数量。
即 $files['name'] 或 $files['error'](或任何一个 $files 的元素)中的元素数量。
*********************************************************/
 
$files_number = count($files['name']);
 
/********************************************************
改变数组 $files 的结构。
目的:把 $files 中的每个文件的信息取出,放在独立的数组中:
*********************************************************/
 
$arr_files = array();
 
for($i=0;$i < $files_number;$i++){
$arr_files[$i]['name'] = $files['name'][$i];
$arr_files[$i]['type'] = $files['type'][$i];
$arr_files[$i]['tmp_name'] = $files['tmp_name'][$i];
$arr_files[$i]['error'] = $files['error'][$i];
$arr_files[$i]['size'] = $files['size'][$i];
}
 
print_r($arr_files);
 
打印内容大概如下:
 
Array
(
[0] => Array
(
[name] => x01.jpg
[type] => image/jpeg
[tmp_name] => D:\temp\php10E.tmp
[error] => 0
[size] => 1001
)
 
[1] => Array
(
[name] => x02.jpg
[type] => image/jpeg
[tmp_name] => D:\temp\php10F.tmp
[error] => 0
[size] => 1956
)
 
[2] => Array
(
[name] => x03.jpg
[type] => image/jpeg
[tmp_name] => D:\temp\php110.tmp
[error] => 0
[size] => 6333
)
 
)

 

posted @ 2017-11-10 20:27  Uncle_Jay  阅读(129)  评论(0编辑  收藏  举报