PHP move_uploaded_file无效,但没有生成错误

时间:2013-03-05 03:13:24

标签: php

我有一个文件上传页面,我已经完成了代码并逐行地逐行插入调试行,以试图找到导致此问题的原因。问题出现在这段代码中:

      $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

编辑:以上内容真的令人困惑,所以让我澄清一下。 &#34;错误:1&#34;不参考$ _FILES [&#39; image_large&#39;] [&#39;错误&#39;]。它是一个布尔引用,无论move_uploaded_file是否有效,因此获得1是所需的结果。

该目标是文件的正确位置。然而,当我检查时,没有文件&#34; C:\ xampp \ htdocs \ photos \ fingerlakes1.jpg&#34;虽然调试结果似乎表明计算机确信它成功完成了任务,但仍然产生了。

我还确保该文件夹已启用写入权限(我在Windows 7上),虽然我认为如果这是原因,$success将不会评估为真。

编辑:我也尝试使用print_r($_FILES)检查所有内容,然后返回:

  

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

所以看起来文件已正确上传到tmp文件夹,至少。

编辑2:如果有帮助,请提供更多信息:我正在使用XAMPP,XAMPP控制面板以管理员模式运行。我现在只进行本地测试(换句话说,文件上传应该只是将文件从我的计算机的一部分复制到另一部分)。我进入了目的地文件夹&#34;照片&#34;和&#34;缩略图&#34;并右键单击 - &gt;属性 - &gt;安全性,并确保列出的每个用户都具有写访问权限,以确保。此计算机上只有一个帐户,但它将帐户名称列为用户和管理员两次,加上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:发现问题的可能原因:我发现计算机上的每个文件夹都勾选了#34;只读&#34;的复选框。除了这个php问题之外,这并没有阻止我在计算机上做任何事情,但无论如何我用谷歌搜索了它。发现这个: http://itexpertvoice.com/home/fixing-the-windows-7-read-only-folder-blues/

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

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

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

我要检查的第二件事是将数据库上传到网络主机,以及运行网站管理端所需的所有php / html文件。我有一种唠叨的感觉,即使文件上传表单在我的计算机上无法正常工作,它也能正常工作。

当我下班回家并报告回来时,我会尝试这些。

1 个答案:

答案 0 :(得分:0)

当您收到error code: 1时,这意味着maximum upload limit已被超越,php.ini中的php配置定义了php.ini。有两种方法可以增加限额:1,使用post_max_size修改ini_set()if)或2。

在上传文件时,最好使用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)"; } } 语句,以便在需要时进行正确的错误处理。

例如:

{{1}}