PHP实现文件上传

PHP实现文件上传时间会让人遗忘一切,而整理遗忘的知识会让你在未来的路上不迷茫!很多网站都需要实现文件上传功能,这个功能说大不大,说小不小,但是如果文件上传出现漏洞,可能会导致网站的控制权被hack拿下,所有文件上传的控制要做到严格严格再严格,为了更加深刻研究文件上传漏洞的原理,本文主要编写了文件上传的基本功能,只是简单的做了一个校验。先看我的前端页面,这里额前端代码和原来有点小小的区别,那就是采用二进制传输的…

时间会让人遗忘一切,而整理遗忘的知识会让你在未来的路上不迷茫!
很多网站都需要实现文件上传功能,这个功能说大不大,说小不小,但是如果文件上传出现漏洞,可能会导致网站的控制权被hack拿下,所有文件上传的控制要做到严格严格再严格,为了更加深刻研究文件上传漏洞的原理,本文主要编写了文件上传的基本功能,只是简单的做了一个校验。
先看我的前端页面,这里额前端代码和原来有点小小的区别,那就是采用二进制传输的方法进行数据传输。前端文件名:upload.php

<!DOCTYPE html>
<html>
<head>
	<title>文件上传</title>
	<meta charset="utf-8">
</head>
<body>
	<center>
		<!-- enctype="mulipart/form-data"属性是指以二进制方式进行数据传输 
		传输文件需要设置-->
		<form action="upload_server.php" method="post" enctype="multipart/form-data">
		<input type="hidden" name="max_file_size" value="1048576">
		<input type="file" name="file">
		<input type="submit" name="上传">		
	</form>
	</center>
	
</body>
</html>

文件上传的接收,处理都写在以下这段代码中,这个文件起名为upload_server.php

<?php 
	header("content-type:text/html;charset=utf-8");
	//设置时区
	date_default_timezone_set('PRC');
	//获取文件名
	$filename = $_FILES['file']['name'];
	//获取文件临时路径
	$temp_name = $_FILES['file']['tmp_name'];
	//获取大小
	$size = $_FILES['file']['size'];
	//获取文件上传码,0代表文件上传成功
	$error = $_FILES['file']['error'];
	//判断文件大小是否超过设置的最大上传限制
	if ($size > 2*1024*1024){
		//
		echo "<script>alert('文件大小超过2M大小');window.history.go(-1);</script>";
		exit();
	}
	//phpinfo函数会以数组的形式返回关于文件路径的信息 
	//[dirname]:目录路径[basename]:文件名[extension]:文件后缀名[filename]:不包含后缀的文件名
	$arr = pathinfo($filename);
	//获取文件的后缀名
	$ext_suffix = $arr['extension'];
	//设置允许上传文件的后缀
	$allow_suffix = array('jpg','gif','jpeg','png');
	//判断上传的文件是否在允许的范围内(后缀)==>白名单判断
	if(!in_array($ext_suffix, $allow_suffix)){
		//window.history.go(-1)表示返回上一页并刷新页面
		echo "<script>alert('上传的文件类型只能是jpg,gif,jpeg,png');window.history.go(-1);</script>";
		exit();
	}
	//检测存放上传文件的路径是否存在,如果不存在则新建目录
	if (!file_exists('uploads')){
		mkdir('uploads');
	}
	//为上传的文件新起一个名字,保证更加安全
	$new_filename = date('YmdHis',time()).rand(100,1000).'.'.$ext_suffix;
	//将文件从临时路径移动到磁盘
	if (move_uploaded_file($temp_name, 'uploads/'.$new_filename)){
		echo "<script>alert('文件上传成功!');window.history.go(-1);</script>";
	}else{
		echo "<script>alert('文件上传失败,错误码:$error');</script>";
	}

 ?>

在文章结尾处,在附一个文件上传error码以及含义:
$_FILES[‘file’][‘error’]有以下几种类型

1、UPLOAD_ERR_OK:其值为 0,没有错误发生,文件上传成功。

2、UPLOAD_ERR_INI_SIZE:其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值。

3、UPLOAD_ERR_FORM_SIZE:其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。

4、UPLOAD_ERR_PARTIAL:其值为 3,文件只有部分被上传。

5、UPLOAD_ERR_NO_FILE:其值为 4,没有文件被上传。

6、UPLOAD_ERR_NO_TMP_DIR:其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。

7、UPLOAD_ERR_CANT_WRITE:其值为 7,文件写入失败。PHP 5.1.0 引进。
在这里插入图片描述

文章为作者原创,欢迎路过大佬点评,如需转载,请注明出处!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36753.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注