上传图片到服务器,是程序开发过程中必不可少的一个功能。它不但可以达到共享图片的目的,而且可以提高网站的访问量,丰富网站的内容。本例将讲解如何通过POST方式实现多图片上传,运行结果如图11.24所示。
图11.24 同时上传多个文件
【操作步骤】
第1步,创建index.php文件。为index.php文件添加表单,设置enctype属性值为"multipart/form-data",添加文件域,用POST方法将表单中数据提交到index_ok.php页面。
<form action="index_ok.php" method="post" enctype="multipart/form-data" name="form1"> <h3>请选择要上传的图片:</h3> <p><input name="picture[]" type="file" id="picture[]" size="30"></p> <p><input name="picture[]" type="file" id="picture[]" size="30"></p> <p><input name="picture[]" type="file" id="picture[]" size="30"></p> <p><input name="picture[]" type="file" id="picture[]" size="30"></p> <p><input type="reset" name="reset" value="重 置"> <input type="submit" name="submit" value="上 传"></p> </form>
第2步,创建index_ok.php文件,获取表单中提交的数据,将多个文件存储到服务器中。
<?php header ( "Content-type: text/html; charset=UTF-8" ); //设置文件编码格式 if (!empty( $_FILES ["picture"]) ) { $data = date ( "Y-m-d H:m:s" ); function check($var) { //验证数组的返回值是否为空 return ($var != ""); } $array = array_filter ( $_FILES ["picture"] ["name"], "check" ); //去除数组中空值 $temp = ""; foreach ( $array as $key => $value ) { //循环读取数组中数据 $types = strtolower ( strstr ( $value, '.' ) ); //截取上传文件的后缀 if ($types == ".jpg" || $types == ".gif" || $types == ".png") { //判断上传文件的后缀是否符合要求 $original = 'pic/'; $file_name = time () . $key . strtolower ( strstr ( $value, "." ) ); //定义上传文件名称 $path = $original . $file_name; //定义原始文件的存储位置 move_uploaded_file ( $_FILES ["picture"] ["tmp_name"] [$key], $path ); //执行上传操作 } else { echo "上传文件" . $value . "类型不正确!"; } } echo "<script>alert('图片上传成功'); window.location.href='index.php';</script>"; } ?>
多文件上传的关键是如何定义上传文件元素的名称及判断上传文件的数量。在本实例中,以数组的形式定义上传文件的名称,上传文件的名称是“picture[]" ,为了达到可以上传任意数量图片(4个图片以内)的目的,在对上传文件进行处理的过程中应用array_filter()函数和回调函数去除数组中的空元素。
array_filter()函数能够使用回调函数过滤数组中的单元,语法如下所示:
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
参数说明如下:
- array:要循环的数组。
- callback:使用的回调函数。如果没有提供callback 函数,将删除input中所有等值为FALSE 的条目。
- flag:决定callback接收的参数形式,简单说明如下:
- ARRAY_FILTER_USE_KEY :callback接受键名作为的唯一参数。
- ARRAY_FILTER_USE_BOTH :callback同时接受键名和键值。
该函数将返回过滤后的数组。