您的位置:首页 > 编程语言 > PHP开发

php中的文件上传与下载(单文件)

2016-05-19 00:01 477 查看
再说文件上传之前先插一段php的输出语句。

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"]就是得到上传后存在服务器的临时文件。

文件上传的源码:

上传的文件保存在当前文件夹下:uploads
html代码: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() 形式调用该函数,来隐藏错误信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php