文件上传与下载概述:
在b/s程序中文件上传与下载已经成为一个常用的功能,其目的是为了让客户能够通过浏览器将文件上传至服务器端指定目录或从服务器端指定目录将文件下载到本地电脑。
文件上传下载功能已经被广泛应用在各大知名互联网产品
文件上传
传统上的html表单只能提交普通文本信息
如:
这种方式无法实现某些系统的功能,如:带附件的电子邮件等。
为了满足传递文件信息的需要,http协议实现了文件的上传机制。从而可以将客户端的文件上传至服务器端指定目录
要实现文件上传的功能,需要对
表单属性进行如下设置:1.enctype="multipart/form-data“//指定表单编码数据方式
这里是固定写法,否则文件上传失败
此设置告诉服务器,我们要上传一个文件,上传的文件带有常规的表单信息
此设置告诉浏览器,在提交表单时,上传的文件将以二进制数据个数进行传递
2.method="post“
定义数据的传输方式为post
一般情况下,form提交数据的方式都设置为
post
通过设置MAX_FILE_SIZE隐藏域的值控制上传文件的大小(字节)
如:
注意:
1.这是一个隐藏域,定义了上传文件的大小上限,超过这个值时,上传失败
2.必须定义在文件域的前面,否则是不能生效的
3.这里定义的值不能超过在php.ini文件中
upload_max_filesize设置的值,否则没有意义
4.建议大家最好在表单中使用MAX_FILE_SIZE隐藏域
,目的就是为了避免用户花费大量的时间去等待根
本上传不了的文件
php.ini文件中对文件上传的配置:
file_uploads =on|off
是否允许通过http上传文件,默认为on,即允许
upload_tmp_dir ="路径"
用来说明php上传的文件放置的临时目录
upload_max_filesize =2M
允许上传文件的最大值,默认为2M
post_max_size =8M
post方式提交表单数据的最大值
max_input_time
对以POST、GET方式接收数据的时间进行限制,以秒为单位。
memory_limit
设置脚本可以分配到的最大内存,以MB为单位。这可以防止失控的脚本独
占服务器内存
max_execution_time
设置了在强制终止脚本前,php等待脚本执行完毕的时间,此时间以秒计算。
注意:表单传递的数据,文件只是其中一部分,所以设置时,upload_max_filesize应该小于post_max_size的值
文件上传相关属性:
使用超级全局变量$_FILES来接收上传的文件
1.$_FILES['userfile']['name'] :客户端上传文件的名称
2.$_FILES['userfile']['type'] :客户端上传文件的类型
3.$_FILES['userfile']['size'] :客户端上传文件的大小,以字节为单位
4.$_FILES['userfile']['tmp_name'] :文件被上传后在服务端储存的临时全路径。
5.$_FILES['userfile']['error'] :由文件上传导致的错误代码
注意:
值为0:代表没有发生错误,文件上传成功
值为1:代表上传的文件大小超过了php.ini文件中
upload_max_filesize设置的值
值为2:代表上传文件的大小超过了html表单中MAX_FILE_SIZE选项
指定的值
值为3:代表文件只有部分被上传
值为4:代表没有文件本上传
文件上传相关函数:
(1)此函数主要用来确定是否上传文件
is_uploaded_file($_FILES['userfile']['tmp_name'])
案例:
if(is_uploaded_file($_FILES['userfile']['tmp_name'])){
echo "已经上传到临时文件夹";
}else{
echo "上传失败";
}
(2)此函数主要用来将存放在临时目录下的文件更名并移动到新的位置,
若成功,则返回true,若失败,则返回false
move_uploaded_file(要移动的文件,新的位置)
案例:
$image_path="/upload/";//指定目录
$filename="1.jpg";//新的名称
//参数1:存放在临时目录下的文件 参数2:要移动到的新位置
if(move_uploaded_file($_FILES['userfile']['tmp_name'],$image_path.$filename)){
echo "已经上传到临时文件夹";
}else{
echo "上传失败";
}
文件上传案例:
html代码
this is a file.html
上传文件:
if($_FILES['filename']['tmp_name'] == "") {
exit (“您没有上传文件”);
}
$img_path = "/upload/";//指定上传文件存放路径
$file_name="1.jpg";
if(is_uploaded_file($_FILES['filename']['tmp_name'])) {
move_uploaded_file($_FILES['filename']['tmp_name'] , $img_path.$file_name);
echo "文件名为 : $file_name"."
“
echo "文件路径为:$img_path";
}else {
exit ("out“);
}
?>
多文件上传:
有两种实现的解决方法:
1.使用不同的表单元素
2.使用数组格式的表单元素
上传中文名文件:
假如说有这样一种情况:
(1)文件的编码方式为utf-8
(2)上传一个中文名称的文件到服务器端保存
问题?
那么服务器端保存的文件名会是什么样子的呢?
经过测试发现,服务器端保存的文件名全是乱码
为什么会出现这个样子呢?
因为系统中文件名的编码方式全为gb2312编码,与当前文件utf-8编码方式不一致
如何解决这个问题呢?
解决方案:在上传文件保存到服务器之前,将上传文件的名称转换为gb2312编码即可
php提供了一个字符编码互转换的函数,可以帮助我们完成字符集间的转换
iconv("utf-8","gb2312",中文文件名);
header()分析:
页面重定向:
//重定向到index.php页面
header("Location: index.php”);
禁止缓存:
//禁止缓存
header(“Cache-Control: no-cache”); // HTTP/1.1
//过去的时间
header(“Expires: Mon, 26 Jul 1997 05:00:00 GMT”);
设置内容类型及字符编码:
//设置页面的字符编码为utf-8
header("content-type:text/html;charset=utf-8");
header('Content-type: application/pdf');
使用header()函数进行文件下载:
除了可以通过链接方式下载文件之外,还可以通过header()函数进行下载
header()函数属于http函数,其作用是以http协议将html文档的标头送到浏览器,并告诉浏览器具体如何处理这个页面
文件下载是web应用中最经常使用的功能,我们经常需要下载一些资料到自己的计算机。通过文件上传我们知道php.ini文件中有关于文件上传大小的约束,这些设置同样适用于文件下载,也就是说通过php程序进行文件下载,最大不能超过php.ini设置的大小
将a.txt文件中的内容覆盖b.txt文件中的内容,并将b.txt文件下载下来
$filename1='a.txt';
$filename='b.txt';
$file=fopen($filename1,'r');
header("content-type: application/octet-stream");//输出MIME类型
header("accept-ranges: bytes");//接受的范围单位
header("accept-length: ".filesize($filename1));//文件长度
//content-disposition:用来提供一个推荐的文件名,强制浏览器显示保存对话框
header("content-disposition:attachment;filename=".$filename);//下载的http标头
readfile($durl);//读取文件
fclose($file);//关闭文件
exit;//退出
?>
问题
如何获取上传文件的后缀?
文件上传功能几乎是所有网站所必备的,然而该功能对于服务器来说具有很大风险,因此应该对文件的大小和类型进行限制。可以通过获取上传文件的后缀来限制上传文件的类型
方法1:
if($_POST['sub']){
$a=strrev($_FILES['userfile']['name']);//获取上传文件的名称并反转
$b=explode(".",$a);//字符串分割
$c=strrev($b[0]);//获取文件名后缀
echo "文件名的后缀为".$c;
}
?>
方法2:
if($_POST['sub']){
$a=$_FILES['userfile']['name'];//获取上传文件的名称
$b=explode(".",$a);//字符串分割
$c=end($b);//获取文件名后缀
echo "文件名的后缀为".$c;
}
?>
方法3:
if($_POST['sub']){
$a=$_FILES['userfile']['name'];//获取上传文件的名称
$c=substr($a,strpos($a,'.'));//获取文件名后缀
echo "文件名的后缀为".$c;
}
?>