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

再说文件上传之前先插一段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() 形式调用该函数,来隐藏错误信息

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值