php中的文件上传与下载(单文件)
2016-05-19 00:01
477 查看
再说文件上传之前先插一段php的输出语句。
print() 只能打印出简单类型变量的值(如int,string)
print_r() 可以打印出复杂类型变量的值(如数组,对象)
echo 输出一个或者多个字符串
1.$_FILES["myfile"]["name"] 得到客户端机器的文件源文件的名称,包含扩展名。(myfile表单中文件的名字)
2.$_FILES["myfile"]["size"] 得到已上传文件的大小,单位为字节。(myfile表单中文件的名字)
3.$_FILES["myfile"]["temp_name"] 文件被上传后,在服务器端存储的临时文件名,这是存储在临时目录(由php指令upload_temp_dir指定)中指定的文件名(myfile表单中文件的名字)
4.$_FILES["myfile"]["error"] 伴随文件上传出现的错误,有五个可能的值,0:表示上传文件没有错误,上传成功。1:表示文件超出php配置文件中指令的大小(myfile表单中文件的名字)upload_max_filesize选项所指定的值。2:表示文件超出了HTML表单中MAX_FILE_SIZE选项所指定的值。3:表示文件只被部分上载。4:表示没有上传任何文件。(myfile表单中文件的名字)
2.第二个参数:要分割的字符串,
3.第三个参数:可选,
大于 0 - 返回包含最多 limit 个元素的数组
小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组
0 - 返回包含一个元素的数组
这两个数组合起来使用可以用在文件上传的实例中,
获取文件的后缀名,例如:
Array ( [0] => test [1] => jpg )
png
那么输出的的$f就是文件的后缀名(png),可以做进一步的判断。
true,则检查搜索的数据与数组的值的类型是否相同。)
例如:
运行结果:存在于数组中
结合上面的例子,可以在文件上传中判断是否为需要上传的类型。
这个函数的第一个参数是要移动的文件,第二个参数是文件的新位置(这个路径是上传后将上传文件存在本地的路径,包含文件的新名字)。
$_FILES["myfile"]["temp_name"]就是得到上传后存在服务器的临时文件。
html代码:upload.html
下载的是当前文件夹upload下的download.jpg图片
html代码:download.html
php代码:download.php
header("Content-Type:image/gif");
是发送指定文件MIME类型的头信息。
header("Content-Disposition:attachment;filename=".$name);
是发送描述文件的头信息:附件和文件名
header("Content-Length:".filesize($filename));是发送指定文件大小的信息,单位为字节。
若成功,则返回从文件中读入的字节数。若失败,则返回 false。您可以通过 @readfile() 形式调用该函数,来隐藏错误信息
php输出函数
echo是PHP中语句, print和print_r是函数,语句没有返回值,函数可以有返回值print() 只能打印出简单类型变量的值(如int,string)
print_r() 可以打印出复杂类型变量的值(如数组,对象)
echo 输出一个或者多个字符串
接下来就说文件的上传:
首先需要做的是接收表单传过来的文件,用$_FILES
1.$_FILES["myfile"]["name"] 得到客户端机器的文件源文件的名称,包含扩展名。(myfile表单中文件的名字)2.$_FILES["myfile"]["size"] 得到已上传文件的大小,单位为字节。(myfile表单中文件的名字)
3.$_FILES["myfile"]["temp_name"] 文件被上传后,在服务器端存储的临时文件名,这是存储在临时目录(由php指令upload_temp_dir指定)中指定的文件名(myfile表单中文件的名字)
4.$_FILES["myfile"]["error"] 伴随文件上传出现的错误,有五个可能的值,0:表示上传文件没有错误,上传成功。1:表示文件超出php配置文件中指令的大小(myfile表单中文件的名字)upload_max_filesize选项所指定的值。2:表示文件超出了HTML表单中MAX_FILE_SIZE选项所指定的值。3:表示文件只被部分上载。4:表示没有上传任何文件。(myfile表单中文件的名字)
字符串分割、截取和判断:
1.explode()函数把字符串打散为数组。
1.第一个参数:必须,确定在哪里分割字符串2.第二个参数:要分割的字符串,
3.第三个参数:可选,
大于 0 - 返回包含最多 limit 个元素的数组
小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组
0 - 返回包含一个元素的数组
2.array_pop()函数,删除数组中的最后一个元素
例如:<?php $a=array("red","green","blue"); array_pop($a); print_r($a); ?>运行后的结果是:Array ( [0] => red [1] => green )
这两个数组合起来使用可以用在文件上传的实例中,
获取文件的后缀名,例如:
<?php $a = explode(".","test.jpg.png"); $f = array_pop($a); print_r($a); print_r("<br>"); print_r($f); ?>运行的结果是:
Array ( [0] => test [1] => jpg )
png
那么输出的的$f就是文件的后缀名(png),可以做进一步的判断。
3.in_array()函数搜索数组中是否存在指定的值。
这个函数有两个参数,第一个参数是需要判断的值,第二个参数是数组。(第三个参数是可选。如果设置该参数为true,则检查搜索的数据与数组的值的类型是否相同。)
例如:
<?php $name = array("张三l", "李四", "王五", "田七"); if (in_array("李四", $name)) { echo "存在于数组中"; } else { echo "不存在数组中"; } ?>
运行结果:存在于数组中
结合上面的例子,可以在文件上传中判断是否为需要上传的类型。
上传成功之后的一些操作:
$filename = date("YmdHis").rand(100, 999).".".$f;//定义上传图片的名字得到的文件新的名字是:年月日+100~999的随机数+“.”+后缀名。
is_uploaded_file($_FILES['myfile']['tmp_name']//判断是否未上传文件,如果是返回true,否则返回false
move_uploaded_file(string filename,string destination)
这个函数可以将上传后的文件移动到新位置,因为上传后的文件都是先放在服务器的临时文件中。这个函数的第一个参数是要移动的文件,第二个参数是文件的新位置(这个路径是上传后将上传文件存在本地的路径,包含文件的新名字)。
$_FILES["myfile"]["temp_name"]就是得到上传后存在服务器的临时文件。
文件上传的源码:
上传的文件保存在当前文件夹下:uploadshtml代码:upload.html
<html lang="en"> <head> <meta charset="UTF-8"> <title>文件上传</title> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> 选择文件:<input type="file" name="myfile"> <input type="submit" value="上传"> </form> </body> </html>php代码:upload.php
<?php $filetype = array("gif", "png","jpg","jpeg"); //设置充许上传的类型为gif, png, jpg, jpeg $size = 1000000; //设置充许大小为1M $path = "uploads"; //设置上传后保存文件的路径 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('没有上传任何文件'); default: die('未知错误'); } } $f = array_pop(explode(".",$_FILES['myfile']['name'])); //获取文件的后缀名 if(!in_array($f, $filetype)) { //判断文件的后缀名 die("不支持此文件类型!"); } if($_FILES['myfile']["size"] > $size){ //判断文件是否超出了定义的大小 die("超过了定义的大小!"); } $newname = date("YmdHis").rand(100, 999).".".$f; if (is_uploaded_file($_FILES['myfile']['tmp_name'])) { //判断文件是否为上传 if(!move_uploaded_file($_FILES['myfile']["tmp_name"], $path.'/'.$newname)){ //移动文件 die('文件不能移动到指定目录。'); } }else{ die("不是上传的文件"); } echo "文件".$newname."上传成功"; ?>文件的下载:
下载的是当前文件夹upload下的download.jpg图片
html代码:download.html
<html lang="en"> <head> <meta charset="UTF-8"> <title>文件下载</title> </head> <body> <img src="uploads/download.jpg" alt="图片"><br> <a href="download.php">下载图片</a> </body> </html>
php代码:download.php
<?php $filename = "uploads/download.jpg"; $name = explode("/", $filename)[1];<span style="white-space:pre"> </span>//得到图片的名字 header("Content-Type:image/gif"); header("Content-Disposition:attachment;filename=".$name); header("Content-Length:".filesize($filename)); readfile($filename); ?>
header("Content-Type:image/gif");
是发送指定文件MIME类型的头信息。
header("Content-Disposition:attachment;filename=".$name);
是发送描述文件的头信息:附件和文件名
header("Content-Length:".filesize($filename));是发送指定文件大小的信息,单位为字节。
filesize() 函数返回指定文件的大小。
如果成功返回文件的大小,失败则返回 false 并生成一条 E_WARNING 级的错误。readfile() 函数输出一个文件。
该函数读入一个文件并写入到输出缓冲。若成功,则返回从文件中读入的字节数。若失败,则返回 false。您可以通过 @readfile() 形式调用该函数,来隐藏错误信息
相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- php7 读取php.ini[4]
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站
- PHP 5.3.0 安装分析心得
- apache 环境下 php 的配置注意事项
- 简单好用的PHP分页类
- ASP.NET、ASP、PHP、JSP之间有什么区别?
- PHP VBS JS 函数 对照表