【问题标题】:PHP file upload won't accept zip filesPHP 文件上传不接受 zip 文件
【发布时间】:2012-10-02 19:47:11
【问题描述】:

我正在使用 PHP 将 .jpg、.gif、.jpeg、.png、.zip 和 .rar 文件上传到upload/ 目录。只允许授权用户(具有给定密码)上传文件。我已经为文件夹upload/ 所有权www-data:www-data 提供了适当的访问权限,所以这不是问题。

上传效果很好,只要我直接在服务器上通过网站上传,该服务器托管整个网站并且其 IP 与某个域相关联。如果我转到另一台计算机并尝试通过网站将 zip 文件上传到服务器,我会收到一条 Invalid file 消息,并且没有任何内容被上传或存储在数据库中。这是我的代码:

$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = end(explode(".", $_FILES["fajl"]["name"]));
$allowedExts1 = array("zip", "rar");
$extension1 = end(explode(".", $_FILES["fajl"]["name"]));
if ((($_FILES["fajl"]["type"] == "image/gif")
    || ($_FILES["fajl"]["type"] == "image/jpeg")
|| ($_FILES["fajl"]["type"] == "image/png")
|| ($_FILES["fajl"]["type"] == "image/pjpeg"))
    && ($_FILES["fajl"]["size"] < 4000000)
    && in_array($extension, $allowedExts))
{
    if ($_FILES["fajl"]["error"] > 0)
    {
        echo "Return Code: " . $_FILES["fajl"]["error"] . "<br />";
    }
    else
    {
        echo "Upload: " . $_FILES["fajl"]["name"] . "<br />";
        echo "Type: " . $_FILES["fajl"]["type"] . "<br />";
        echo "Size: " . ($_FILES["fajl"]["size"] / 1024) . " KB<br />";
        echo "Temp file: " . $_FILES["fajl"]["tmp_name"] . "<br />";

        if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/upload/slike/' . $nav . '/' . $_FILES["fajl"]["name"]))
        {
            echo $_FILES["fajl"]["name"] . " already exists. ";
        }
        else
        {
            move_uploaded_file($_FILES["fajl"]["tmp_name"], $_SERVER['DOCUMENT_ROOT'] . '/upload/slike/' . $nav . '/' . $_FILES["fajl"]["name"]);
            echo "Stored in: " . $_SERVER['DOCUMENT_ROOT'] . '/upload/slike/' . $nav . '/' . $_FILES["fajl"]["name"];
            $pomlokacijasl='/upload/slike/' . $nav . '/' . $_FILES["fajl"]["name"];
            $query22 = "INSERT INTO `slike` (navig, slik) VALUES ('$nav', '$pomlokacijasl')";
            $query22 = mysql_query($query22) or trigger_error ("Error in query: $query22. ".mysql_error());
            mysql_free_result($query22);
        }
    }
}
else if ((($_FILES["fajl"]["type"] == "application/x-rar-compressed")
    || ($_FILES["fajl"]["type"] == "application/zip"))
    && ($_FILES["fajl"]["size"] < 25000000)
    && in_array($extension1, $allowedExts1)) 
{
    if ($_FILES["fajl"]["error"] > 0)
    {
        echo "Return Code: " . $_FILES["fajl"]["error"] . "<br />";
    }
    else
    {
        echo "Upload: " . $_FILES["fajl"]["name"] . "<br />";
        echo "Type: " . $_FILES["fajl"]["type"] . "<br />";
        echo "Size: " . ($_FILES["fajl"]["size"] / 1024) . " KB<br />";
        echo "Temp file: " . $_FILES["fajl"]["tmp_name"] . "<br />";

        if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/upload/datoteke/' . $nav . '/' . $_FILES["fajl"]["name"]))
        {
            echo $_FILES["fajl"]["name"] . " already exists. ";
        }
        else
        {
            move_uploaded_file($_FILES["fajl"]["tmp_name"], $_SERVER['DOCUMENT_ROOT'] . '/upload/datoteke/' . $nav . '/' . $_FILES["fajl"]["name"]);
            echo "Stored in: " . $_SERVER['DOCUMENT_ROOT'] . '/upload/datoteke/' . $nav . '/' . $_FILES["fajl"]["name"];
            $pomlokacijadat='/upload/datoteke/' . $nav . '/' . $_FILES["fajl"]["name"];
            $query22 = "INSERT INTO `datoteke` (navig, dat) VALUES ('$nav', '$pomlokacijadat')";
            $query22 = mysql_query($query22) or trigger_error ("Error in query: $query22. ".mysql_error());
            mysql_free_result($query22);
        }
    }
}
else
{
    echo "Invalid file";
}

我该如何解决这个问题?将$_SERVER('DOCUMENT_ROOT') 附加到$_SERVER('SERVER_NAME') 是否有效?

【问题讨论】:

  • 您希望将 html 表单放在一台服务器上,并将 scipt 发布到另一台服务器上?
  • 你应该得到你的扩展,比如:$ext = pathinfo($_FILES["fajl"]["name"], PATHINFO_EXTENSION);,你应该通过strtolower()运行它,因为image.JPG将被认为是Invalid file与你当前的代码。
  • 不,我不想要那样的东西。 html 表单和 php 脚本都在同一个 .php 文件中。更新:从另一台机器上传图片(.jpg、.gif、.jpeg、.png)文件有效,但上传 .zip 文件无效,我不知道为什么。上传 .zip 文件只能在同一台机器上工作。我认为问题与 $_SERVER('DOCUMENT_ROOT') 变量有关,但事实并非如此。
  • 这个想法是,如果上传的文件是图片,它会被上传到/upload/slike/(一些数字),如果上传的文件是.zip,它应该被上传到/upload/datoteke/ (一些数字)。问题是,.zip 文件被这样识别并仅从服务器的机器正确上传,如果我去另一台计算机并尝试上传 .zip 文件,它不起作用,我不知道为什么。
  • 不要只是echo "Invalid file"。让它显示有用的信息,例如echo $_FILES["fajl"]["name"] . " is an invalid file of type " . $_FILES["fajl"]["type"].

标签: php file upload


【解决方案1】:

您的 MIME 类型检查排除了 zip 文件的一些有效类型。它因浏览器而异,但最常见的类型是:

application/zip   
application/x-zip
application/octet-stream
application/x-zip-compressed

您应该允许所有这些在您的检查中。要匹配您的其余代码,请将其设置为:

$allowedCompressedTypes = array("application/x-rar-compressed", "application/zip", "application/x-zip", "application/octet-stream", "application/x-zip-compressed");

else if (in_array($_FILES["fajl"]["type"], $allowedCompressedTypes)
    && ($_FILES["fajl"]["size"] < 25000000)
    && in_array($extension1, $allowedExts1)) {

【讨论】:

  • .rar 文件的所有有效类型都有哪些?它们是一样的吗?
  • @MatjažLojen 根据:.rar, .zip files MIME Type RAR MIME 类型可以是application/x-rar-compressedapplication/octet-stream,所以我的答案中的数组将起作用,因为它包含两者。 application/x-rar-compressed 适用于 RAR,application/octet-stream 适用于 RAR 和 ZIP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 2013-06-15
  • 2012-05-12
  • 1970-01-01
相关资源
最近更新 更多