文件的上传
利用php上传文件的过程是:通过 form 表单上传文件传递给php文件处理存入服务器。
1. form 表单
使用 post 方式(显然,不能通过 get 方式上传),表单设置 enctype="multipart/form-data",使用<input type='file' name='myfile'>。
注意几个特征属性:
POST方法:表单最常用的功能,向目标页面传递变量,我们在上传文件的时候,会在表单中设置相应的属性,来完成文件的传递
enctype="multipart/form-data" 这样服务器就会知道,我们要传递一个文件,这样服务器可以知道上载的文件带有常规的表单信息。
MAX_FILE_SIZE 此字段必须在文件输入字段之前,控制最大的传递文件的大小(字节)
<input type="file" name="userfile"> 设置浏览器文件输入浏览按钮
2. 服务器端通过php处理上传
具体需要通过以下三个方面信息:
设置PHP配置文件中的指令:用于精细地调节PHP的文件上传功能。
$_FILES多维数组:用于存储各种与上传文件有关的信息,其他数据还是使用$_POST获取。
PHP的文件上传处理函数:用于上传文件的后续处理。
PHP配置文件中与文件上传有关的选项
超级全局数组$_FILES
$_FILES["myfile"]["name"]中的值是: 客户端文件系统的文件的名称
$_FILES["myfile"]["type"]中的值是: 客户端传递的文件的类型
$_FILES["myfile"]["size"]中的值是: 文件的字节的大小
$_FILES[“myfile”][“tmp_name”]中的值是: 文件被上传后在服务器存储的临时全路径
$_FILES["myfile"]["error"]中的值是: 文件上传的错误代码-php 4.2以后增加的功能
存储在$_FILES["myfile"]["error"]中的值
值为0:表示没有发生任何错误。
值为1:表示上传文件的大小超出了约定值。文件大小的最大值是在PHP配置文件中指定的,该指令是:upload_max_filesize。
值为2:表示上传文件大小超出了HTML表单隐藏域属性的MAX_FILE_SIZE元素所指定的最大值。
值为3:表示文件只被部分上传。
值为4:表示没有上传任何文件。
值为6:表示找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
值为7:表示文件写入失败。PHP 5.1.0 引进。
错误值对应常量
UPLOAD_ERR_OK : 对应值0
UPLOAD_ERR_INI_SIZE : 对应值1
UPLOAD_ERR_FORM_SIZE : 对应值2
UPLOAD_ERR_PARTIAL : 对应值3
UPLOAD_ERR_NO_FILE : 对应值4
UPLOAD_ERR_NO_TMP_DIR : 对应值6
UPLOAD_ERR_CANT_WRITE : 对应值7
常见的数据格式(MIME)
上传成功的文件会被放置到服务器端临时目录下,文件名是随机生成的临时文件名。
注:该文件在程序执行完后将自动被删除掉。在删除前可以像本地文件一样操作。
文件上传处理函数:
is_uploaded_file —判断文件是否是通过 HTTP POST 上传的
格式:bool is_uploaded_file ( string $filename )
move_uploaded_file — 将上传的文件移动到新位置
格式:bool move_uploaded_file ( string $filename , string $destination )
注意:如果目标文件已经存在,将会被覆盖。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php上传</title> </head> <body> <form method="post" enctype="multipart/form-data"> 姓名:<input type="text" name="name"><br><br> 上传:<input type="file" name="myfile"><br><br> <input type="submit" value="提交"> </form> <?php $file = $_FILES['myfile']['tmp_name']; if(is_uploaded_file($file)){ var_dump($_FILES['myfile']); switch($_FILES['myfile']['type']){ case 'image/jpeg': $pic = '.jpg'; break; case 'image/jpg': $pic = '.jpg'; break; case 'image/gif': $pic = '.gif'; break; case 'image/png': $pic = '.png'; break; default: echo '上传的格式不正确'; exit; } $upload = 'upload/'.time().rand(1,1000).$pic; if(move_uploaded_file($file,$upload)){ echo '上传成功!'; }else{ echo '上传失败!'; } } ?> </body> </html>
多文件上传
多文件上传与上面的单文件上传所不同的主要在两处:
1.form表单的 <input type="file" name="myfiles[]" multiple="multiple"> 这里注意name值使用一个数组,并添加multiple属性(这个是HTML5新增的特性)
2.服务器端php处理的是数组,因此代码要相应修改。如下示例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php上传</title> </head> <body> <form method="post" enctype="multipart/form-data"> 姓名:<input type="text" name="name"><br><br> 上传:<input type="file" name="myfile[]" multiple="multiple"><br><br> <input type="submit" value="提交"> </form> <?php $files = $_FILES['myfile']; if(is_uploaded_file($files['tmp_name'][0])){ //var_dump($files); foreach($files['type'] as $type){ switch($type){ case 'image/jpeg': $pic[] = '.jpg'; break; case 'image/jpg': $pic[] = '.jpg'; break; case 'image/gif': $pic[] = '.gif'; break; case 'image/png': $pic[] = '.png'; break; default: echo '上传的格式不正确'; exit; } } //var_dump($pic); $i = 0; foreach($files['tmp_name'] as $tmp){ $upload = 'upload/'.time().rand(1,1000).$pic[$i]; if(move_uploaded_file($tmp,$upload)){ echo '上传成功!'; }else{ echo '上传失败!'; exit; } $i++; } } ?> </body> </html>
文件下载
通过 header 下载文件
<?php //文件下载 $filename="./upload/1500428853129.jpg"; $basename=pathinfo($filename); header("Content-Type: application/octet-stream"); //指定下载文件类型的 header("Content-Disposition:attachment;filename=".$basename["basename"]); //指定下载文件的描述信息 header("Content-Length:".filesize($filename)); //指定文件大小的 readfile($filename);//将内容输出,以便下载。 ?>