我正在尝试从文件中复制数据,创建新文件,从此表复制内容,将其放在表格中并输出。但是,在浏览并选择文件后,我表中唯一的输出是文件的路径。
我还尝试将内容复制并粘贴到我创建的新文件中。但是,我的代码只是清除它并只在文件中放置路径。
任何提示?
<?php
$Semester = $_POST['Semester'];
$CourseID = $_POST['CourseID'];
$SectionID = $_POST['SectionID'];
$file = $_POST['SelectFile'];
echo "You entered:".$Semester.",".$CourseID."&".$SectionID.".";
if (file_exists($file)){
echo "The file ".$file." exists.";
}
else {
echo "The file ".$file."does not exist.";
}
file_put_contents("hw3data_server.txt" , $file);
//copy('$file','hw3data_server.txt');
$myfile = fopen("hw3data_server.txt","r") or die ("Unable to return file.");
?>
<table>
<tr>
<th>Student Name</th>
<th>Course Grade</th>
</tr>
<?php
while(($row = fgets($myfile)) != false) {
echo "<tr>";
$col = explode("\n",$row);
foreach($col as $data) {
echo "<td>". trim($data)."</td>";
}
echo "</tr>";
}
?>
</table>
</body>
</html>
<form method="post" action="hw3_grade_form.php">
<h3>Please submit semester (e.g., Spring 2018), course ID (e.g., BCS 350),
Section ID (e.g., 21695), and upload a text file that includes all student names.</h3><br />
Semester: <input type="text" name="Semester" value="" /><br />
Course ID: <input type="text" name="CourseID" value="" /><br />
Section ID: <input type="text" name="SectionID" value="" /><br />
Select File: <input type="file" name="SelectFile" /><br />
<input type="submit" value="Submit" />
答案 0 :(得分:2)
正如我在评论中所说的那样。但是让我们来看看你的代码。
$file = $_POST['SelectFile'];
file_put_contents("hw3data_server.txt" , $file);
int file_put_contents(string $ filename,mixed $ data [,int $ flags = 0 [,resource $ context]])
$file
是您文件的名称。 file_put_contents
的第二个参数是数据,因此您将文件名放在文件的数据中。哪个惊喜会创建一个包含文件名的文件。
现在你评论了一下。
//copy('$file','hw3data_server.txt');
这是复制文件的正确方法,但您使用'$file'
单引号,不进行变量插值(不会将变量的值放在适当位置)所以您尝试复制文件名称为$file
的字面意思,而不是$file
的值,即文件名。
而是尝试copy($file,'hw3data_server.txt');
没有单引号。
这种逻辑是有缺陷的
if (file_exists($file)){
echo "The file ".$file." exists.";
}else {
echo "The file ".$file."does not exist.";
}
file_put_contents("hw3data_server.txt" , $file);
看到检查是好的,一切都很好,但无论如何你只是去做。假设if
条件无法阻止运行file_put_contents
。没什么,你回应错误然后继续执行它。
do{
if (file_exists($file)){
echo "The file ".$file." exists.";
}else {
echo "The file ".$file."does not exist.";
break; //exit doWhile
}
if(!@copy($file, "hw3data_server.txt"){
echo "Failed to copy the file ".$file;
break; //exit doWhile
}
//rest of code...
}while(false);
参见Do While循环,与while循环有点不同。 while循环检查条件然后运行,do while循环运行1次,然后检查条件。因此,当条件为假时,此循环仅运行一次。
为什么要使用它。
好吧,它让我们可以利用break
来退出循环。
因为这是程序性的,没有类没有函数,控制执行流的唯一方法是嵌套if条件,以便排除我们不想运行的代码块。
但是,我们可以使用这个小技巧并突破循环并随时停止运行。
<强>更新强> 我认为这使用了现有文件,而不是http上传表单,感谢@Omar Tanti指出这一点。
由于这是一个HTTP上传表单,因此您必须在表单标记中添加enctype="multipart/form-data"
。它与数据如何通过服务器传递有关,但我并不关心这些细节,只要相信我没有它就无法工作。
<form method="post" action="hw3_grade_form.php" enctype="multipart/form-data" >
现在我们已修复此问题,而不是使用$_POST['SelectFile']
,您需要使用$_FILES['SelectFile']['tmp_name']
。 $_FILES
中还有一些其他重要的内容,所以我会快速echo '<pre>'; var_export($_FILES);
查看详细信息。
最后一件事是你真的不应该这样移动和复制上传文件,你应该使用
bool move_uploaded_file (字符串 $ filename ,字符串 $ destination )
此函数检查以确保filename指定的文件是有效的上载文件(意味着它是通过PHP的HTTP POST上载机制上传的)。如果文件有效,它将被移动到目的地给出的文件名。
如果上传文件中的任何内容都可能向用户显示其内容,甚至向同一系统上的其他用户显示内容,则此类检查尤其重要。
出于各种安全原因。基本上,这会检查文件是否已上载,从而减轻了一些目录遍历攻击。这种类型的攻击使用文件名指向服务器上的文件,然后可以将其输出并显示给攻击者(或者至少是我理解它的方式)。
一个例子是上传一个文件,其名称被构造成模仿wp-config.php
的位置。例如名为../../wp-config.php
的文件。此文件中包含数据库用户和密码信息(用于wordpress)。 ../
向上导航到一个目录级别。因此,服务器可以向上导航两个级别,然后拉取该文件。然后,如果您在代码中读出“已上载”文件的内容,而不检查它是否实际上是上传的文件。这可能会欺骗服务器读出该文件的内容并将其显示给“攻击者”,从而将它们提供给服务器等等。(这可能是一个很糟糕的例子,但我能想到的最好的是我的头)。
换句话说,这几乎是一团糟。
我建议查看一些基本的文件上传教程,因为它们可以覆盖构建文件上传的过程,远远好于在此处理。此类“教程”也远远超出了SO的Q&amp; A格式的范围。
也就是说,您可以使用copy
替换上面代码中的move_uploaded_file($_FILES['SelectFile']['tmp_name'],"hw3data_server.txt")
,这至少应该让您入门。但是,对于我上面提到的一些安全考虑,值得一读。
对不起,这太漫长了。