PHP 文件上传

示例代码:

upload.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<div class="register">
	<!-- 
	文件上传要注意:①enctype  ②method post
	enctype 属性规定在将表单数据发送到服务器之前如何对其进行编码。
	注意:只有 method="post" 时才使用 enctype 属性。
	<form enctype="value">
	属性值描述
	application/x-www-form-urlencoded	默认。在发送前对所有字符进行编码(将空格转换为 "+" 符号,特殊字符转换为 ASCII HEX 值)。
	multipart/form-data	不对字符编码。当使用有文件上传控件的表单时,该值是必需的。
	text/plain	将空格转换为 "+" 符号,但不编码特殊字符。
	-->
		<form enctype="multipart/form-data" method="post"  action="upload.php" name="myform">
		<table>
		<tr><td align="center"  colspan="2"><font style="font-size: 40px;font-family: 华文彩云;">文件上传</font></td></tr>
		<tr><td>请填写用户名:</td><td><input type="text" name="username" /></td></tr>
		<tr><td>请简单介绍该文件</td><td><textarea name="fileintro" rows="10" cols="80"></textarea></td></tr>
		<tr><td>请选择你要上传文件1:</td><td><input type="file" name="myfile" /></td></tr>
		<tr><td><input type="submit" value="上传文件" /></td><td></td></tr>		
		</table>
		</form>
	</div>
</body>
</html>


upload.php

<?php
header("Content-Type:text/html;Charset=utf-8");
	//1、接收提交的文件及其用户信息
	$username=$_POST['username'];
	$fileintro=$_POST['fileintro'];

	//echo $username."||".$fileintro;

	//我们这里需要使用到 $_FILE
	echo "<pre>";
	/* $_FILES["file"]["name"] - 被上传文件的名称
	$_FILES["file"]["type"] - 被上传文件的类型
	$_FILES["file"]["size"] - 被上传文件的大小,以字节计
	$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
	$_FILES["file"]["error"] - 由文件上传导致的错误代码 */
	print_r($_FILES);
	echo "</pre>";
	if ($_FILES["myfile"]["error"] > 0)
	{
	    echo "Error: " . $_FILES["myfile"]["error"] . "<br>";
	}
	else
	{
	    echo "Upload: " . $_FILES["myfile"]["name"] . "<br>";
	    echo "Type: " . $_FILES["myfile"]["type"] . "<br>";
	    echo "Size: " . ($_FILES["myfile"]["size"] / 1024) . " kB<br>";
	    echo "Stored in: " . $_FILES["myfile"]["tmp_name"]. "<br>";
	}
	/* 上传文件需要考虑的细节:
	(1), 如何控制用户上传的文件大小 < 2m
	(2), 如何控制用户上传的文件类型(问题!)
	(3), 如何防止用户图片覆盖问题
	(4), 如何防止同一个用户上传的文件名相同问题 */
	
	//2、获取文件大小、格式等
	//获取文件的大小
	$file_size=$_FILES['myfile']['size'];

	if($file_size>2*1024*1024){
		echo "文件过大,不能上传大于2m文件";
		exit();
	}

	//获取文件的类型
	$file_type=$_FILES['myfile']['type'];
	
	if (($file_type!="image/gif")&&($file_type!="image/jpeg")&&($file_type!="image/jpg")
	    &&($file_type!="image/pjpeg")&&($file_type!="image/x-png")&&($file_type!="image/png")){
		echo "文件类型只能是图片";
		exit();
	}
	//3、转存文件
	//is_uploaded_file() 函数检查指定的文件是否是通过 HTTP POST 上传的。
    //如果文件是通过 HTTP POST 上传的,该函数返回 TRUE。
	if(is_uploaded_file($_FILES['myfile']['tmp_name'])){
		//要转存的文件
		$uploaded_file=$_FILES['myfile']['tmp_name'];
		//我们给每个用户动态的创建一个文件夹
		$user_path=$_SERVER['DOCUMENT_ROOT']."/file/upload/$username/";
		echo '要创建的文件目录:'.$user_path;
		//判断该用户是否已经有文件夹
		if(!file_exists($user_path)){
		    //如果不存在,创建该目录
			mkdir("$user_path",0777,true);
		} 
		$file_true_name=$_FILES['myfile']['name'];
		/* strrpos() 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写)。
		注释:strrpos() 函数是区分大小写的。
		相关函数:
		strpos() - 查找字符串在另一字符串中第一次出现的位置(区分大小写)
		stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
		strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
		语法
		strrpos(string,find,start)
		string	必需。规定被搜索的字符串。
		find	必需。规定要查找的字符。
		start	可选。规定开始搜索的位置。 */
		/* substr() 函数返回字符串的一部分。
		注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。
		语法
		substr(string,start,length)
		
		参数	描述
		string	必需。规定要返回其中一部分的字符串。
		start	必需。规定在字符串的何处开始。
		正数 - 在字符串的指定位置开始
		负数 - 在从字符串结尾的指定位置开始
		0 - 在字符串中的第一个字符处开始
		length	可选。规定要返回的字符串长度。默认是直到字符串的结尾。
		正数 - 从 start 参数所在的位置返回
		负数 - 从字符串末端返回 */
		//文件转存后的文件名
		$move_to_file=$user_path.time().rand(1,1000).substr($file_true_name,strrpos($file_true_name,".")); 
		//转存文件
		//move_uploaded_file() 函数把上传的文件移动到新位置。
        //如果成功该函数返回 TRUE,如果失败则返回 FALSE。
		if(move_uploaded_file($uploaded_file,iconv("utf-8","gb2312",$move_to_file))){
			echo $_FILES['myfile']['name']."转存ok<br/>";
			echo '文件上传后的具体路径:'.$move_to_file;
		}else{
			echo "文件转存失败";
		}
	}else{
		echo "文件上传失败";
	}
?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值