[TOC]
>[success]通过 PHP,可以把文件上传到服务器。或者从服务器下载文件
## 创建一个文件上传表单
**实例**
~~~
<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
~~~
`<form>` 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。
`<input>` 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
## 创建上传脚本
"upload_file.php" 文件含有供上传文件的代码:
~~~
<?php
if ($_FILES["file"]["error"] > 0){
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}else{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>
~~~
通过使用 PHP 的全局数组$_FILES,你可以从客户计算机向远程服务器上传文件。
第一个参数是表单的 input name,第二个下标可以是 "name", "type", "size", "tmp_name" 或 "error"。就像这样:
<table>
<tbody><tr>
<td>$_FILES["file"]["name"]</td>
<td>被上传文件的名称</td>
</tr>
<tr>
<td>$_FILES["file"]["type"] </td>
<td>被上传文件的类型</td>
</tr>
<tr>
<td>$_FILES["file"]["size"]</td>
<td>被上传文件的大小,以字节计</td>
</tr>
<tr>
<td>$_FILES["file"]["tmp_name"]</td>
<td>存储在服务器的文件的临时副本的名称</td>
</tr>
<tr>
<td>$_FILES["file"]["error"]</td>
<td>由文件上传导致的错误代码</td>
</tr>
</tbody></table>
## 上传限制
**PHP.ini上传文件配置项**
<table>
<tbody><tr>
<td>file_uploads = On /Off</td>
<td>是否允许文件上传</td>
</tr>
<tr>
<td>upload_max_filesize = 2M</td>
<td>上传的文件的最大大小 </td>
</tr>
<tr>
<td>post_max_size = 8M</td>
<td>POST数据所允许的最大大小</td>
</tr>
<tr>
<td>upload_tmp_dir </td>
<td>上传文件放置的临时目录</td>
</tr>
</tbody></table>
**上传表单的限制**
~~~
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
~~~
**PHP脚本的限制**
~~~
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000)){
echo "条例要求"
}
?>
~~~
## 保存被上传的文件
上面的例子在服务器的 PHP 临时文件夹创建了一个被上传文件的临时副本。
这个临时的复制文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:
~~~
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000)){
if ($_FILES["file"]["error"] > 0){
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}else{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
if (file_exists("upload/" . $_FILES["file"]["name"])){
echo $_FILES["file"]["name"] . " already exists. ";
}else{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}else{
echo "Invalid file";
}
?>
~~~
## 多文件上传
设置name属性为数组格式,实现多文件上传处理
~~~
<form action="82.php" method="post" enctype="multipart/form-data">
文件1:<input type="file" name = "upfile[]"/><br/>
文件2:<input type="file" name = "upfile[]"><br/>
<input type="submit" value="上传文件"/>
</form>
~~~
通过属性multiple来实现,multiple 属性规定输入字段可选择多个值。
~~~
<form action="demo_form.asp" method="get">
Select images: <input type="file" name="img" multiple="multiple" />
<input type="submit" />
</form>
~~~
## 文件下载
~~~
<?php
$file="./Upload/575e163e8938f.pptx";
header("Content-type:application/octet-stream");//二进制文件
$fileName = basename($file);//获得文件名
header("Content-Disposition:attachment;filename=$fileName");//下载窗口中显示的文件名
header("Accept-ranges:bytes");//文件尺寸单位
header("Accept-length:".filesize($file));//文件大小
readfile($file);//读出文件内容
?>
~~~
>[danger] 练习:实现多文件上件,做一个简单的文件管理系统。
- 序言
- 第一章:准备工作
- 写在学习之前的话
- web应用开发结构
- 开发工具/环境
- 第二章:展现层面(HTML/CSS)
- HTML简介
- HTML基础
- HTML编码
- HTML链接
- HTML图像
- HTML列表
- HTML表单
- HTML表格(分水岭)
- HTML 实体
- HTML框架
- CSS层叠样式表
- CSS选择器
- CSS文本/字体
- CSS继承和叠加
- CSS框模型
- CSS浮动(分水岭)
- CSS定位
- CSS背景
- CSS图标字体
- CSS补充
- 开发技巧
- 第三章:展现层面(Javascript)
- JS简介
- JS实现
- JS输出交互
- JS变量
- JS数据类型
- JS运算符
- JS流程控制(分水岭)
- JS函数
- JS数组
- JS对象(分水岭)
- JS数组对象
- JS字符串对象
- JS数学对象
- JS日期对象
- JS BOM对象(分水岭)
- JS DOM对象
- JS事件对象
- JS元素对象
- JS DOM节点
- 第四章:展现层面(Jquery)
- JQ简介
- JQ使用
- JQ选择器
- JQ筛选
- JQ属性
- JQ-CSS
- JQ事件
- JQ文档处理
- JQ效果
- JQ-ajax
- 第五章:逻辑/业务层面(PHP)
- PHP简介
- PHP变量
- PHP数据类型
- PHP常量
- PHP运算符
- PHP流程控制
- PHP函数(分水岭)
- PHP日期
- PHP数学
- PHP数组
- PHP字符串
- PHP正则表达式(分水岭)
- PHP目录操作
- PHP文件
- PHP上传/下载
- PHP面向对象(分水岭)
- PHP图像处理
- PHP会话控制
- Ajax异步处理
- PHPMysql扩展
- PHPMysqli扩展
- PHPPdo扩展
- PHP接口
- PHP命名空间
- 第六章:逻辑/业务层面(框架设计)
- 第七章:存储层面(mysql)
- Mysql基础
- Mysql Sql简介
- Mysql数据库
- Mysql数据类型
- Mysql数据表
- Mysql操作记录
- Mysql查询
- Mysql修改表结构
- Mysql日期与时间
- Mysql分组统计
- Mysql多表查询
- Mysql安全
- Mysql存储引擎
- Mysql事务
- Mysql视图
- Mysql触发器
- Mysql存储过程
- Mysql存储函数
- Mysql优化
- 第八章:服务器(Linux)
- Linux介绍与安装
- Shell
- 目录与文件操作
- VIM编辑器使用
- 帐号管理
- SUDO
- 权限控制
- 压缩与打包
- 软件安装
- 计划任务
- 进程管理
- 宝塔Linux面板