文件的上传
利用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);//将内容输出,以便下载。
?>

