(问题解答)关于文件操作和图片上传的问题
问题描述:
文件上传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
关于文本上传和图片上传重复问题的回复。