Can';上传错误的文件类型PHP时不会出现回显错误
我正在尝试这样做,当用户上传任何不是csv文件的文档时,会出现回显错误。但是,当我测试它时,在正确的文件类型和不正确的文件类型上都出现了回显错误。有人知道我哪里出错了吗Can';上传错误的文件类型PHP时不会出现回显错误,php,upload,echo,Php,Upload,Echo,我正在尝试这样做,当用户上传任何不是csv文件的文档时,会出现回显错误。但是,当我测试它时,在正确的文件类型和不正确的文件类型上都出现了回显错误。有人知道我哪里出错了吗 <?php ob_clean();session_start(); if (isset($_GET['logout'])){ session_destroy(); } if (!isset($_SESSION['loggedin']) || $_SESSION['logged
<?php
ob_clean();session_start();
if (isset($_GET['logout'])){
session_destroy();
}
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] == false) {
header("Location: index.php");
}
if(isset($_FILES['UploadFileField'])){
$allowed = array('csv');
$UploadName = $_FILES['UploadFileField']['name'];
$UploadTmp = $_FILES['UploadFileField']['tmp_name'];
$UploadType = $_FILES['UploadFileField']['type'];
$NewFileName = "project1file.txt";
if(!$UploadTmp){
echo '<font color="#FF0000" size="3"><p align="center"><b>No File Selected, Please Try Again.</b></p></font>';
}else{
move_uploaded_file($UploadTmp, "UPLOADS/$NewFileName");
echo '<font color="#006600" size="3"><p align="center"><b>File Successfully Uploaded.</b></p></font>';
}
if(!in_array($UploadTmp,$allowed) ) {
echo 'error';
}
}
?>
使用以下代码查找上载文件的扩展名:
$type = $_FILES["UploadFileField"]["type"];
然后回音
if(!in_array($type,$allowed) ) {
echo 'error';
}
更新1:
$mimes = array('application/vnd.ms-excel','text/plain','text/csv','text/tsv');
if(in_array($_FILES['UploadFileField']['type'],$mimes)){
// do something
} else {
die("Sorry, mime type not allowed");
}
更新2:
您也可以使用它,实际上$\u文件…['type']使用起来不安全
$types = array('csv');
$ext = pathinfo($UploadName, PATHINFO_EXTENSION);
if(in_array($ext,$types)){
// do something
} else {
die("Sorry, only CSV type allowed");
}
尽管csv确实有一种格式,但仍有许多设备没有预先配置适当的mimetype(但请注意,csv实际上是一种格式系列)
mimetype和扩展名都是客户端对文件内容的断言,不应被信任
至于为什么您的代码没有达到预期的效果……您正在比较mimetype(应该是“text/csv”)和“csv”。它们不一样
至于你错在哪里
您的代码不包含任何注释。您可以通过检测代码来详细说明实际到达服务器的内容,从而自己发现问题。您不应该在验证文件之前调用move_uploaded_file(),您可能应该有一种更可靠的方法来验证文件。请在isset file condition中添加3个变量
1.$target_dir = "uploads/";
2.$target_file = $target_dir . basename($_FILES["UploadFileField"]["name"]);
3.$FileType = pathinfo($target_file,PATHINFO_EXTENSION);
情况就是这样
if (isset($_FILES['UploadFileField']))
{
$allowed = array('csv');
$UploadName = $_FILES['UploadFileField']['name'];
$UploadTmp = $_FILES['UploadFileField']['tmp_name'];
$UploadType = $_FILES['UploadFileField']['type'];
$NewFileName = "project1file.txt";
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["UploadFileField"]["name"]);
$FileType = pathinfo($target_file, PATHINFO_EXTENSION);
}
if (!$FileType)
{
echo '<font color="#FF0000" size="3"><p align="center"><b>No File Selected, Please Try Again.</b></p></font>';
}
else
{
move_uploaded_file($UploadTmp, $target_file);
echo '<font color="#006600" size="3"><p align="center"><b>File Successfully Uploaded.</b></p></font>';
}
if (!in_array($FileType, $allowed))
{
echo 'error';
}
if(isset($\u文件['UploadFileField']))
{
$allowed=数组('csv');
$UploadName=$_文件['UploadFileField']['name'];
$UploadTmp=$\u文件['UploadFileField']['tmp\u名称'];
$UploadType=$\u文件['UploadFileField']['type'];
$NewFileName=“project1file.txt”;
$target_dir=“uploads/”;
$target_file=$target_dir.basename($_FILES[“UploadFileField”][“name”]);
$FileType=pathinfo($target\u文件,pathinfo\u扩展名);
}
if(!$FileType)
{
echo“未选择任何文件,请重试。
”;
}
其他的
{
移动上传的文件($UploadTmp,$target文件);
echo文件已成功上载。;
}
如果(!in_数组($FileType,$allowed))
{
回声“错误”;
}
请检查您的文件夹名。现在是“上传”$\u文件['UploadFileField']['tmp\u name']代码>不包含文件扩展名:它包含临时文件的路径。使用var\u dump($UploadTmp)
查看变量中的内容。通过只查看文件的扩展名来解决此问题。您可以使用explode('.',$UploadName)
并获取它生成的数组的最后一部分。您还可以尝试在$UploadType
中使用mime类型。但是请注意,用户可以上载文件并手动更改扩展名。因此不能保证内容实际上是CSV。使用pathinfo($UploadTmp,pathinfo_扩展名)代码>这获取扩展名,所以我尝试了$ext=pathinfo($UploadName,pathinfo\u扩展名)
和echo$ext
但是这次没有回显任何内容?没有看到前面的注释,但是我用$UploadTmp
尝试了相同的方法,得到了相同的结果检查文件的mime类型不信任扩展名。我见过一些网站在…中使用带有php代码的图像进行黑客攻击,并检查$\u文件['UploadFileField']['type']]
中是否包含“text/csv”。这已经成功了,谢谢,如果它不是CSV,我如何阻止它上传?这比我在没有上传文件的情况下上传要简单得多?@MatthewHutchings你的意思是说你只想允许CSV文件?这是可行的,但是,我不希望用户能够上传excel提供的其他文档类型?@MatthewHutchings告诉我你想允许哪些特定的文档类型?