学习笔记

  > (问题解答)关于文件操作和图片上传的问题

(问题解答)关于文件操作和图片上传的问题

问题描述:

文件上传txt时候,总是覆盖,而没有像上传图片一样生成新的文件。

问题代码:

前台文件html

<!DOCTYPE HIML>
<html>
	<head>
		<title></title>
		<meta charset="utf-8">
	</head>
	<body>
		<h1>上传图片</h1>
		<form method='post' action='tpsc.php' enctype="multipart/form-data">
		<!--enctype="multipart/form-data"	指定的编码方式-->
			<input type='text' name='username' placeholder='作者'>
			<input type='file' name='tpfile'>
			<input type='submit' value='上传文件'>
		</form>
	</body>
</html>

后台php接收处理文件

<?php

	header("content-type:text/html;charset=utf-8");
	
	$username = $_POST['username']; 		//得到上传作者
	
	$tpfile = $_FILES['tpfile'];			//得到传输的数据
	
	
	$ext = explode(".",$tpfile['name']);							//以点分割数组
	
	$extname = end($ext);											//文件的后缀名
	
	if($extname!='jpg'&&$extname!='png'&&$extname!='gif'){			//检测文件格式
		die("文件类型错误".'<br>'.header("Refresh:3;url=dlcg.php"));
	}
	
	if($tpfile['size']>2000000){									//检测文件大小
		die("文件过大".'<br>'.header("Refresh:3;url=dlcg.php"));
	}
	
	$filename = 'koukou'.time().rand(100,999).'.'.$extname;

	//move_uploaded_file(临时位置,指定位置);

	move_uploaded_file($tpfile['tmp_name'],"tx/".$filename);
	
	$handle = fopen('tx/test.txt',"w");								//写入文件
	
	fwrite($handle,"$username\r\n");
	
	die("上传成功".'<br>'.header("Refresh:3;url=dlcg.php"));
	

	
?>
问题分析:

关于文件覆盖的问题,说破天也是程序针对同一个文件进行操作导致的覆盖。

那么为什么之前的图片上传则没有呢,

我们看下代码:

move_uploaded_file($tpfile['tmp_name'],"tx/".$filename);

文件图片上传的时候使用了这样的代码,而$filename则是经过处理的,

$filename = 'koukou'.time().rand(100,999).'.'.$extname;

这样就避免了文件的覆盖,对不同文件上传,而我们看下txt的上传,

$handle = fopen('tx/test.txt',"w");								//写入文件
	
fwrite($handle,"$username\r\n");

仅仅使用了对文件的操作,而test.txt是没有变得,这样导致所有的文件都对test.txt进行了操作。

这样就必然会导致覆盖了文件。

解决方法:

如果是想通过上传来处理不重复的问题,那么就没有必要使用文件的操作。

如果是针对文件操作使用文本流的话,那么就和文件上传无关了。

老老实实操作文件就好。

修改代码如下:

$file_url = "tx/";
$txtname = $filename;
$handle = fopen( $file_url.$txtname ,"w");								//写入文件
fwrite($handle,"$username\r\n");
fclose($handle);

全部代码:

<?php

	header("content-type:text/html;charset=utf-8");
	
	$username = $_POST['username']; 		//得到上传作者
	
	$tpfile = $_FILES['tpfile'];			//得到传输的数据
	
	$ext = explode(".",$tpfile['name']);							//以点分割数组
	
	$extname = end($ext);											//文件的后缀名
	
	if($extname!='jpg'&&$extname!='png'&&$extname!='gif'){			//检测文件格式
		// die("文件类型错误".'<br>'.header("Refresh:3;url=dlcg.php"));
	}
	
	if($tpfile['size']>2000000){									//检测文件大小
		die("文件过大".'<br>');
	}
	
	$filename = 'koukou'.time().rand(100,999).'.'.$extname;

	//move_uploaded_file(临时位置,指定位置);

	move_uploaded_file($tpfile['tmp_name'],"tx/".$filename);
	
	$file_url = "tx/";
	$txtname = $filename;

	$handle = fopen( $file_url.$txtname ,"w");								//写入文件
	
	fwrite($handle,"$username\r\n");

	fclose($handle);
	
	// die("上传成功".'<br>'.header("Refresh:3;url=dlcg.php"));
	exit();
	

	
?>

如果是上传不重复,则把如下的文本操作删掉就好。

$file_url = "tx/";
$txtname = $filename;

$handle = fopen( $file_url.$txtname ,"w");								//写入文件
	
fwrite($handle,"$username\r\n");

fclose($handle);
问题结果:

实际上这个问题还是混淆了上传和文本操作,只要注意区分就可以解决掉。

发布时间:2017-10-07,13:18:22

关于文本上传和图片上传重复问题的回复。

作者:澎蠡

让学习成为一种习惯,让知识交流变成一种生活方式。