Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';上传错误的文件类型PHP时不会出现回显错误_Php_Upload_Echo - Fatal编程技术网

Can';上传错误的文件类型PHP时不会出现回显错误

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

我正在尝试这样做,当用户上传任何不是csv文件的文档时,会出现回显错误。但是,当我测试它时,在正确的文件类型和不正确的文件类型上都出现了回显错误。有人知道我哪里出错了吗

<?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告诉我你想允许哪些特定的文档类型?