[TOC]
# 文件上传
### 客户端上传设置
* 在B/S程序中文件上传已经成为一个常用功能。其目的是客户可以通过浏览器(Browser)将文件上传到服务器(Server)上的指定目录。
* PHP中文件上传的基础知识:
客户端form表单
服务器端对上传文件的操作
```
客户端文件上传的form表单:
<html>
<head><title>文件上传</title></head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
选择文件:<input type="file" name="myfile">
<input type="submit" value="上传文件">
</form>
</body>
</html>
```
注意几个特征属性:
* POST方法:
表单最常用的功能,向目标页面传递变量,我们在上传文件的时候,会在表单中设置相应的属性,来完成文件的传递
* enctype="multipart/form-data"
这样服务器就会知道,我们要传递一个文件,这样服务器可以知道上载的文件带有常规的表单信息。
* MAX_FILE_SIZE
此字段必须在文件输入字段之前,控制最大的传递文件的大小(字节)
* 设置浏览器文件输入浏览按钮
```
<input type="file" name="userfile">
```
### 在服务器端通过PHP处理上传
上传文件的接收和处理是通过PHP脚本来处理的,具体需要通过以下三个方面信息:
* 设置PHP配置文件中的指令:用于精细地调节PHP的文件上传功能。
###### PHP配置文件中与文件上传有关的选项:
| 指令名 | 默认值 | 功能描述 |
| --- | --- | --- |
| file_uploads | ON | 是否开启文件上传 |
| upload_max_filesize | 2M | 限制PHP处理上传文件大小的最大值,此值必须小于post_max_size |
| post_max_size | 8M | 限制通过POST方法可以接受信息的最大值,也就是整个POST请求的提交值。此值必须大于upload_max_filesize |
| upload_tmp_dir | NULL | 上传文件存放的临时路径,可以是绝对路径。默认NULL则使用系统的临时目录 |
* $_FILES多维数组:用于存储各种与上传文件有关的信息,其他数据还是使用$_POST获取。
###### 超级全局数组`$_FILES`
* $_FILES["myfile"]["name"]中的值是:
客户端文件系统的文件的名称
* $_FILES["myfile"]["type"]中的值是:
客户端传递的文件的类型
* $_FILES["myfile"]["size"]中的值是:
文件的字节的大小
* $_FILES["myfile"]["tmp_name"]中的值是:
文件被上传后在服务器存储的临时全路径
* $_FILES["myfile"]["error"]中的值是:
文件上传的错误代码-php 4.2以后增加的功能
###### 存储在`$_FILES["myfile"]["error"]`中的值
伴随文件上传时产生的错误信息代码是在PHP4.2.0版本中引入的,具体如下:
* 值为0:表示没有发生任何错误。对应常量的值 `UPLOAD_ERR_OK`
* 值为1:表示上传文件的大小超出了约定值。文件大小的最大值是在PHP配置文件中指定的,该指令是:upload_max_filesize。对应常量的值 `UPLOAD_ERR_INI_SIZE`
* 值为2:表示上传文件大小超出了HTML表单隐藏域属性的MAX_FILE_SIZE元素所指定的最大值。对应常量的值 `UPLOAD_ERR_FORM_SIZE`
* 值为3:表示文件只被部分上传。对应常量的值 `UPLOAD_ERR_PARTIAL`
* 值为4:表示没有上传任何文件。对应常量的值 `UPLOAD_ERR_NO_FILE`
* 值为6:表示找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。对应常量的值 `UPLOAD_ERR_NO_TMP_DIR`
* 值为7:表示文件写入失败。PHP 5.1.0 引进。对应常量的值 `UPLOAD_ERR_CANT_WRITE`
常见的数据格式
|文件类型| MIME类型|
| --- | --- |
|图片文件| image/gif,image/jpg,image/jpeg,image/png,image/x-png|
|纯文本和HTML| text/txt,text/plain,text/html|
|二进制文件| application/octet-stream|
|音频格式| audio/basic|
|视频格式| video/mpeg|
###### PHP的文件上传处理函数:用于上传文件的后续处理。
上传成功的文件会被放置到服务器端临时目录下,文件名是随机生成的临时文件名。
> 注意:该文件在程序执行完后将自动被删除掉。在删除前可以像本地文件一样操作。
文件上传处理函数:
* `is_uploaded_file` —判断文件是否是通过 HTTP POST 上传的
```
格式:bool is_uploaded_file ( string $filename )
```
* `move_uploaded_file` — 将上传的文件移动到新位置
```
格式:bool move_uploaded_file ( string $filename , string $destination )
```
> 注意:如果目标文件已经存在,将会被覆盖。
### 上传代码示例
```
<?php
$allowtype = array("gif", "png", "jpg"); //设置充许上传的类型为gif, png和jpg
$size = 1000000; //设置充许大小为1M(1000000字节)以内的文件
$path = "./uploads"; //设置上传后保存文件的路径
//1. 判断文件是否可以成功上传到服务器,$_FILES['myfile']['error'] 为0表示上传成功
if($_FILES['myfile']['error'] > 0) {
echo '上传错误: ';
switch ($_FILES['myfile']['error']) {
case 1: die('上传文件大小超出了PHP配置中的约定值:upload_max_filesize');
case 2: die('上传文件大小超出了表单中的约定值:MAX_FILE_SIZE');
case 3: die('文件只被部分上载');
case 4: die('没有上传任何文件');
case 6: die('找不到临时文件夹');
case 7: die('文件写入失败');
default: die('末知错误');
}
}
//2. 判断上传的文件是否为充许的文件类型,通过文件的后缀名
$hz = array_pop(explode(".", $_FILES['myfile']['name']));
//3.通过判断文件的后缀方式,来决定文件是否是充许上传的文件类型
if(!in_array($hz, $allowtype)) {
die("这个后缀是<b>{$hz}</b>,不是充许的文件类型!");
}
//4. 判断上传的文件是否为充许大小
if($_FILES['myfile']['size'] > $size ) {
die("超过了充许的<b>{$size}</b>字节大小");
}
//5. 为了系统安全,也为了同名文件不会被覆盖,上传后将文件名使用系统定义
$filename = date("YmdHis").rand(100,999).".".$hz;
//6. 判断是否为上传文件
if (is_uploaded_file($_FILES['myfile']['tmp_name'])) {
if (!move_uploaded_file($_FILES['myfile']['tmp_name'], $path.'/'.$filename)) {
die('问题: 不能将文件移动到指定目录。');
}
}else{
die("问题: 上传文件{$_FILES['myfile']['name']}不是一个合法文件: ");
}
//7. 如果文件上传成功则输出
echo "文件{$upfile}上传成功,保存在{$path}中,大小为{$_FILES['myfile']['size']}字节";
?>
```
# 多文件上传
当需要上传多个文件的情况,有两种实现的解决方法:
* 使用不同的表单元素
```
<input type="file" name="file_a">
<input type="file" name="file_b">
<input type="file" name="file_b">
```
* 使用数组格式的表单元素
```
<input type="file" name="file[]">
<input type="file" name="file[]">
<input type="file" name="file[]">
```
# 文件下载
```
<?php
//文件下载练习
$filename="./upload/aa.png";
$basename=pathinfo($filename);
header("Content-Type: image/png"); //指定下载文件类型的
header("Content-Disposition:attachment;filename=". $basename["basename"]);
//指定下载文件的描述信息
header("Content-Length:".filesize($filename)); //指定文件大小的
readfile($filename);//将内容输出,以便下载。
?>
```
- 前言
- Ⅰ.PHP基础知识
- 1.PHP基本语法(一)
- 2.PHP基本语法(二)
- 3.流程控制结构
- 4.PHP函数
- 5.数组
- 6.字符串
- 7.PHP正则表达式
- 8.PHP的日期和时间
- 9.GD库图像处理
- 10.文件处理系统
- 11.文件上传和下载
- 12.数据库之MySQL(概述)
- Ⅱ.ThinkPHP5入门实践
- 一、先看到页面
- 1.1只展示页面
- 1.2给视图传递数据
- 1.3使用公共模板
- 1.4使用模板布局
- 二、简单的数据库操作
- (1)查
- (2)增
- (3)改
- (4)删
- (5)链式操作
- 三、初级-阶段性综合应用
- (1)注册
- (2)登录
- 四、各种基本操作
- 1.操作Session
- 2.操作Cookie
- 3.文件上传
- 五、富文本编辑器
- 集成wangEditor
- 集成UEditor
- 六、验证码
- 图片验证码
- Ⅲ.常用类库的使用
- 一、PHPExcel表格导入
- 二、PHPExcel表格导出
- 三、阿里大于短信验证码
- 四、时间戳操作Time
- 五、邮件发送
- 六、PHP操作Python
- Ⅳ.实例讲解
- 一、病房管理系统
- 写在前面
- 1.引导页
- 2.公共模板
- 3.登录
- 4.功能引导页集合
- 5.修改密码
- 6.员工信息注册
- 7.员工信息更新
- 8.员工信息删除
- 9.病人信息注册
- 10.病人信息更新
- 11.出院手续办理
- 12.病人信息删除
- 13.科室信息查询
- 14.医护信息查询
- 15.病房信息查询
- 16.病历信息查询
- 加群验证
- 必看推荐阅读【不断更新】