很多网站都会有文件的上传和下载这个功能,所以学习php的文件上传和下载对一个php开发者来说是必不可少的。文件的下载相对于上传更简单,所以先介绍文件的上传吧。
边上代码边说好了。
<form enctype="multipart/form-data" method="post" action="">
上传文件<input type="file" name="myFile"/>
<input type="submit" value="上传"/>
相比如普通的表单,文件上传多了 enctype="multipart/form-data"这一段代码,它的意思就是设置对文件的编码格式,默认情况下是不支持文件上传的,必须加上这个设置。还有就是 input标签里面的type也应该写为file。要想上传文件,这两处都必须修改。
下面是php代码部分:
先说明一下,在html页面中点了"上传"按钮之后,文件其实已经通过httpd协议上传到服务器了,默认的保存位置在c:/windows/temp目录下,不过后缀名是.tmp,代表临时文件。可以通过修改php.ini配置文件改变默认保存位置,在下面会逐一介绍。
主要会用到
is_uploads_file($fileName) //判断上传的文件是否生成了临时文件,生成了返回true,否则返回false
move_uploaded_file($fileName,$destination) //将临时文件移动到指定的位置,成功返回true,失败返回false
这两个函数
来个最基本的案例进行讲解:
if(is_uploaded_file($_FILES['myFile']['tmp_name'])) //$_FILES是超全局变量之一,$_FILES[]['tmp_name']是文件默认保存的路径
{
if(move_uploaded_file($_FILES['myFile']['tmp_name'],"F:/")) //将临时文件转移到F盘下,路径可以自己改
{
echo "文件上传成功";
}
}
下面再注意一些小细节,文件上传就完美实现了,是不是感觉很简单。
文件上传的大小其实是有限制的,默认是2M,也可以修改,下面会将这些配置一起讲解。如果太大了,我们需要对其进行处理。
$_FILES[]['size']可以获取到文件的大小,按字节计算
if($_FILES['myFile']['size']>1024*1024*2)
{
echo "上传文件不得大于2M";
exit();
}
这样就可以将大于2M的文件进行排除了,
文件上传的类型在某些特殊要求下也需要进行限制,比如上传头像,肯定只能上传图片格式的文件。
if($_FILES['myFile']['type']!="image/jpg" && $_FILES['myFile']['type']!="image/pjpeg") //这里只列举了jpg格式的图片,还可以自己添加png或者gif格式的图片
{
echo "只能上传图片类型的文件";
exit();
}
有些用户可能会把
.txt文件改成.jpg文件来上传,这肯定是假的图片,所以也需要排除:
getimagesize($fileName); //得到指定图片的信息,如果没有返回false,通过改后缀名的方式肯定返回的false
文件上传的时候防止文件重名产生覆盖:
可以通过
<pre name="code" class="php">$str=strrchr($_FILES['name'],'.'); //假如是txt文件,就会返回".txt",strrchr($str,$needle),返回$str中$needle最后出现的位置之后的字符串
$fileName=md5(uniqid(microtime(true)),true).$str; //这样生成的字符是独一无二的,md5()和uniqid()的具体用法请查看手册,再加上文件的后缀名
或者可以给每个用户在服务器端创建一个独立的文件夹来存放该用户上传的文件(这也是很多网站的一般做法),这里就不介绍了,以免过于繁琐
简单介绍下多文件上传的原理:在input标签中把name的值设为数组,比如name="myfile[]",然后在接受页面获取myfile数组的长度进行循环单文件上传即可。
下面说明一下php.ini中关于文件上传部分的配置:
file_uploads=On //支持http上传,如果填Off,文件就上传不上去了
upload_tmp_dir= //临时文件的保存目录
upload_max_filesize=2M //允许上传文件的最大值
max_file_uploads=20 //允许一次上传的最大文件数
post_max_size=8M //post方式发送数据的最大值
文件上传就介绍到这。下面是文件下载:
$fileName=$_GET['fileName']; //用get方式获取到要下载的文件名
header('content-disposition:attachment;fileName='.basename($fileName)); //cotent-disposition是指以什么方式下载,attachement是指以附件的方式,basename($fileName)是获取文件名,这里是为了防止文件名带有路径
header('content-length:'.filesize($fileName)); //这里是取得文件的大小
readfile($fileName); //输出文件
这四行代码就搞定文件下载了。