5

我有一个文件上传页面,我浏览了代码并逐行递增地插入调试行,以尝试找出导致此问题的原因。问题出现在这段代码的某处:

      $tmp_name = $_FILES['image_large']['tmp_name'];
      chdir('..'.DIRECTORY_SEPARATOR.'photos');
      $name = getcwd().DIRECTORY_SEPARATOR.$_FILES['image_large']['name'];        
      $success = move_uploaded_file($tmp_name,$name);
      $errormsg = "<p>source: {$tmp_name}</p><p>destination: {$name}</p>";
      $errormsg .= "<p>error: {$success}</p>";

$errormsg将打印在页面上,并显示以下结果:

来源:C:\xampp\tmp\php4A14.tmp

目的地:C:\xampp\htdocs\photos\fingerlakes1.jpg

错误:1

编辑:以上内容确实令人困惑,所以让我澄清一下。“错误:1”不是指 $_FILES['image_large']['error']。这是一个布尔引用,表示 move_uploaded_file 是否有效,因此获得 1 是所需的结果。

该目的地是文件的正确预期位置。然而,当我检查时,没有生成文件“C:\xampp\htdocs\photos\fingerlakes1.jpg”,尽管调试结果似乎表明计算机确信它成功地执行了任务。

我还确保该文件夹启用了写入权限(我在 Windows 7 上),尽管我认为如果这是原因,则$success不会评估为 true。

编辑:我也尝试使用print_r($_FILES)检查一切,它返回:

Array ( [image_large] => Array ( [name] => fingerlakes1.jpg [type] => image/jpeg [tmp_name] => C:\xampp\tmp\php5694.tmp [error] => 0 [size] = > 497376 ) [image_thumb] => 数组 ( [name] => fingerlakes1.jpg [type] => image/jpeg [tmp_name] => C:\xampp\tmp\php5695.tmp [error] => 0 [size] => 26228))

因此,至少文件似乎已正确上传到 tmp 文件夹。

编辑 2:如果有帮助,请提供更多信息:我正在使用 XAMPP,XAMPP 控制面板在管理员模式下运行。我现在只是本地测试(换句话说,文件上传应该只是将文件从我的计算机的一部分复制到另一部分)。我进入目标文件夹“照片”和“缩略图”并右键单击 -> 属性 -> 安全性,并确保列出的每个用户都具有写入权限,以确保。这台计算机上只有一个帐户,但它列出了两次帐户名作为用户和管理员,加上 SYSTEM 和另一个我忘记了。但是为了安全起见,我给了他们所有的写权限。

编辑 3:根据请求,我尝试替换本文顶部第一个代码框中的一些代码,以测试问题,将 chdir 和 getcwd 行替换为目标的文字路径+文件名。目前的代码如下所示:

      $tmp_name = $_FILES['image_large']['tmp_name'];
      //chdir('..'.DIRECTORY_SEPARATOR.'photos');
      //$name = getcwd().DIRECTORY_SEPARATOR.$_FILES['image_large']['name'];
      $errormsg .= "<p>source: {$tmp_name}</p>";
      $errormsg .= "<p>destination: C:\\xampp\\htdocs\\photos\\fingerlakes1.jpg</p>";
      $success = move_uploaded_file($tmp_name,"C:\\xampp\\htdocs\\photos\\fingerlakes1.jpg");

我不得不使用转义序列来写出目标字符串的反斜杠。一开始我忘了这样做,并在页面上打印了错误,显示目标字符串被弄乱了。我假设之前嵌入在变量 $tmp_name 和 $name 中的反斜杠没有问题,因为在这种情况下它没有给出错误。

我想知道Windows使用反斜杠作为目录分隔符而互联网使用正斜杠这一事实是否存在问题,所以......也许XAMPP期待正斜杠?我怀疑这是问题所在,因为很多人在本地使用 XAMPP 来测试他们的代码。

编辑4:发现问题的可能原因:我发现我计算机上的每个文件夹都勾选了“只读”复选框。除了这个 php 问题之外,这并没有阻止我在计算机上做任何事情,但我还是用谷歌搜索了它。找到这个:http: //iteexpertvoice.com/home/fixing-the-windows-7-read-only-folder-blues/

所以这似乎是一个 Windows 错误,但 Windows 通常会忽略只读设置。但是,我想知道 move_uploaded_file 的问题是否与此有关。我将尝试该页面上的一些解决方案并进行报告。

编辑 5:我开始强烈怀疑代码实际上没有任何问题,这更像是一个 Windows 问题。我没有提到的一件事是,我最初将所有站点文件都放在另一个硬盘上,安装了 XAMPP,并且文件上传在那里工作,并且自从移动到新驱动器后代码没有改变。唯一不同的是,当时我手动将图像放入目标文件夹,然后使用文件上传(本质上是上传它们以覆盖自己),以便我可以使用文件上传表单的其余部分并写入MySQL 数据库。那行得通。我发现当前问题的原因之一是写入数据库的代码被文件上传问题阻止了。

所以我要尝试其他一些事情。首先,是测试我之前所做的一切......将文件放在我想要的位置,然后使用上传表单覆盖文件,并检查它是否能够处理其余部分php 代码写入数据库。

我要检查的第二件事是将数据库以及运行站点管理端所需的所有 php/html 文件上传到 Web 主机。我有一种挥之不去的感觉,即文件上传表单可以正常工作,即使它不能在我的计算机上本地工作。

我下班回家后会尝试这些并报告。

4

1 回答 1

0

当您收到error code: 1这意味着maximum upload limit已超过php.ini. 有两种方法可以增加您的限制:1,修改您的php.ini( post_max_size),或 2,使用ini_set().

在上传文件时使用if语句始终是一种很好的做法,以便您可以在需要时进行适当的错误处理。

例如:

if(!move_uploaded_file($_FILES['image_large']['tmp_name'])){
    switch($_FILES['image_large']['error']){
        case 1:
            echo "file to large";
            break;
        case 2:
            echo "file larger than set in form (MAX_FILE_SIZE)";
            break;
        case 3:
            echo "partial upload";
            break;
        case 4:
        default:
            echo "file not uploaded (unknown)";
    }
}
于 2013-03-05T03:35:58.800 回答