【问题标题】:PHP File Upload Script is not writing to temp directoryPHP文件上传脚本未写入临时目录
【发布时间】:2013-04-19 20:45:47
【问题描述】:

好的,所以我的图片上传脚本/应用程序有问题。我一次又一次地尝试调试,但仍然无法找出问题所在。代码似乎很好,但由于某种原因,文件看起来没有保存在临时目录中,因此它可以移动到我服务器上的上传目录。我已经确定我要上传到的目录(上传),包括临时目录,设置了读/写/执行权限,并且上传在 php.ini 文件夹中设置为打开。我有一种感觉,文件永远不会保存到临时文件夹中,但我不确定如何检查是否是这种情况,因为我知道在脚本完成执行后文件被删除。我希望你们能帮助我,因为我不知道该怎么做。这是我的脚本的代码。

另外,这是我的问题所在。

if (is_uploaded_file($filetempname)) {
          $final = "../public_html/uploads/" . $filename;              
          $result = move_uploaded_file($filetempname, $final);
          if($result)
          {
            echo 'success';
            echo "<br>Stored in: " . "public_html/uploads/" . $filename;
          }
          else
          {
            echo 'Image was not uploaded.';
          }

$result= move_uploaded_file($filetempname, $final) 一直返回false,没有任何错误发生的迹象。我知道如果文件类型不正确,它将返回 false 并且不会复制任何内容,并且如果由于某种原因无法移动文件,它将返回 false 并且会发出警告消息说。但是,我根本没有收到任何消息。我所知道的是它返回 false 并且它没有做它应该做的事情。

<?php
error_reporting(E_ALL);
print_r($_FILES);
$filetype = $_FILES["file"]["type"];
$filename = $_FILES["file"]["name"];
$filetempname = $_FILES["file"]["tmp_name"];
$filesize = $_FILES["file"]["size"];
$error = $_FILES["file"]["error"];

$allowedExts = array("gif", "jpeg", "jpg", "png");
$extension = end(explode(".", $filename));
if ((($filetype == "image/gif")
|| ($filetype == "image/jpeg")
|| ($filetype == "image/jpg")
|| ($filetype == "image/pjepg")
|| ($filetype == "image/x-png")
|| ($filetype == "image/png"))
&& ($filesize < 1000000)
&& in_array($extension, $allowedExts)) {
    if ( $error > 0) {
        echo "Error: " . $error . "<br>";
    }
    else {
        echo "Upload: " . $filename . "<br>";
        echo "Type: " . $filetype . "<br>";
        echo "Size: " . ($filesize / 1024) . " KB<br>";
        echo "Stored in: " . $filetempname . "<br>";

        if (file_exists("../public_html/uploads/" . $filename)) {
            echo $filename . " already exists. ";
        }        
        else {
            if (is_uploaded_file($filetempname)) {
              $final = "../public_html/uploads/" . $filename;              
              $result = move_uploaded_file($filetempname, $final);
              if($result)
              {
                echo 'success';
                echo "<br>Stored in: " . "public_html/uploads/" . $filename;
              }
              else
              {
                echo 'Image was not uploaded.';
              }
            }
        }
    }
}
else {
    echo "Invalid file";
}
?>

这是表单的代码。

<form enctype="multipart/form-data" method="post" action="scripts/snap.php">
        <!--<p>
            <input id="plat" class="plat" name="plat" type="hidden" value="" />
            <input id="plon" class="plon" name="plon" type="hidden" value=""  />
        </p>-->
        <div class="row">
            <label for="file">Select an image to Upload</label><br />
            <input type="file" name="file" id="file" /><!--onchange="fileSelected();"--> 
        </div>
        <div id="filename"></div>
        <div id="fileSize"></div>    
        <div id="fileType"></div>
        <div class="row">
            <input type="submit" name="submit" value="Submit" />
            <!--<input type="button" onclick="uploadFile()" value="Upload" />-->
        </div>
        <div id="progressNumber"></div>
    </form>

【问题讨论】:

  • 可能是错字,但$filetype == "image/pjepg" 应该是$filetype == "image/pjpeg"
  • upload 目录的权限是否正确?
  • 是的,我认为是,但它确实不是我的问题的一部分。我实际上什至不需要那个。我只是还没有从我的代码中删除它。但感谢您指出这一点。
  • 是的,我在上面说过,我确保在临时目录和上传目录上都正确设置了权限
  • 你能发布你的脚本输出吗?

标签: php


【解决方案1】:

忘记所有文件类型检查和其他任何事情。编写一个单独的脚本,它只有一个职责:将上传的文件移动到您想要永久存储它的位置。专注于那个一小部分并让它发挥作用。

一旦文件移动代码工作,将其包装在一个函数中,然后,仅当该部分工作时,将文件移动代码集成到您拥有的其余部分中。

这里的总体教训是,当您遇到问题时,最好以足够模块化的方式编写代码,这样可以快速轻松地判断出问题的确切位置。

另外,考虑使用一个框架或库来为你处理这个文件上传工作,因为你在这里重新发明轮子。

【讨论】:

  • 我尝试编写代码而不是使用库或框架的原因是因为这是我的高级项目的一部分,所以我想了解它是如何工作的,而不仅仅是得到一些已经存在的东西把它放在我的项目上并称之为好。
【解决方案2】:

首先,检查您是否正确提交。您是否在表单中包含了 enctype?

<form method='POST' enctype='multipart/form-data' action='upload.php'>

接下来,您的代码print_r($_FILES); 是返回任何值还是为空?

如果是,请尝试检查您知道的上传文件夹中的任何现有文件并使用is_file(),因为您可能指定了不正确的路径。

编辑:表格没有问题

【讨论】:

  • 是的,我使用的是 post 方法,并且 enctype 设置为 multipart/form-data。至于 print_r($_FILES);它根本不返回任何内容,甚至不返回 null。
  • 您也可以发布表单的代码吗?因为如果 $_FILES 为空,那么问题可能出在表单上..
  • 嗯..我突然想起来了。我认为你应该 print_r($_FILES["file"]["name"]) 代替。也是空的吗?
  • 不,它返回的只是要上传的文件的名称。
  • 我检查了代码,这肯定是文件权限或错误路径错误,您要从中复制上传文件的文件夹中有文件吗?你能做一个print_r(is_file('../public_html/uploads/'.$whatever_file_it_is)); 并检查结果吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 2017-12-22
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 2014-11-10
  • 2016-08-02
相关资源
最近更新 更多