为什么我的PHP文件上传代码不起作用?

时间:2015-11-22 00:28:19

标签: php html forms file file-upload

我正在尝试使用PHP制作一个简单的文件上传表单。这是我的代码:

<?php
    $uploads_dir = '/uploads';

    if(isset($_FILES['thefile'])){
      $errors= array();
      $file_name = $_FILES['thefile']['name'];
      $file_size =$_FILES['thefile']['size'];
      $file_tmp =$_FILES['thefile']['tmp_name'];
      $file_type=$_FILES['thefile']['type'];
      $tmp_name = $_FILES['thefile']["tmp_name"];

      if($file_size > 2097152){
         $errors[]='File size must be less than 2 MB';
      }
      if(empty($errors)==true){
         move_uploaded_file($tmp_name, "$uploads_dir/$file_name");
         echo "Success";
      }
      else{
         print_r($errors);
      }
   }
?>
<!DOCTYPE html>
<html>
<head>
    <title>Simple File Upload</title>
</head>
<body>

<form action="" method="POST" enctype="multipart/form-data">
    <input type="file" name="thefile" />
    <input type="submit"/>
</form>

</body>
</html>

我意识到我并不限制文件类型,但是一旦我上传了简单的.jpg或.zip文件,我就会担心这一点。使用上面的代码,我转到位于

的本地服务器上的页面
C:\wamp\www\simpleupload  (this contains index.php, the file posted above)

当我选择一个小图片文件并点击提交时,我发现了以下错误:

  

警告:move_uploaded_file(/uploads/session_timeout_formatting_bug.png):无法打开流:第18行的C:\ wamp \ www \ project_fileshare \ index.php中没有此类文件或目录

  

警告:move_uploaded_file():无法移动&#39; C:\ wamp \ tmp \ phpEFDE.tmp&#39; to&#39; /uploads/session_timeout_formatting_bug.png'在第18行的C:\ wamp \ www \ project_fileshare \ index.php

第18行是调用move_uploaded_file()函数的行。

如何修复此错误?我有一个&#39; uploads_dir&#39;文件夹与index.php文件位于同一文件夹中。 (参考上面的文件路径)。我在这做错了什么?我必须误解这个过程中的一小部分,并将我的目录放在错误的位置,或者我在代码中做错了。

有人可以发现我的错误并告诉我需要做些什么来解决它?

3 个答案:

答案 0 :(得分:2)

您正在使用Windows,并且您告诉PHP一个无法访问的位置(即/uploads linux路径)。

由于您在Windows中工作且文档根目录为C:\wamp\www\simpleupload

这意味着,您的文件位于以下位置:

  • C:\wamp\www\simpleupload\index.php(您的上传脚本)
  • C:\wamp\www\simpleupload\uploads(应上传文件的地方)

为什么不使用这样的绝对路径:

$uploads_dir = getcwd() . DIRECTORY_SEPARATOR . 'uploads';

getcwd()函数将返回执行PHP脚本的当前工作目录(在您的情况下为index.php),因此$uploads_dir现在将如下所示:C:\wamp\www\simpleupload\uploads

试试这个。

答案 1 :(得分:0)

如果您的上传目录与index.php位于同一位置,请删除&#34; /&#34;在你的$ uploads_dir变量中。这个,或者添加一个&#34;。&#34;在斜杠之前,因为现在它引用了可能是其他东西的根,然后是当前的工作目录。说到魔鬼; http://php.net/manual/en/function.getcwd.php

$uploads_dir = getcwd() . '\uploads';
$uploads_dir = __DIR__ . '\uploads'; #php > 5.6

另外,检查你的目录是否可以写入php: http://php.net/manual/en/function.is-writable.php

Latheesan说,最好是跨平台,因为我在编辑中看到同样的错误。

<?php
    function buildPath(...$segments){
        return join(DIRECTORY_SEPARATOR, $segments);
    }

    echo buildPath(__DIR__, 'uploads');
?>

答案 2 :(得分:0)

我会改变

if(isset($_FILES['thefile'])){

if($_FILE['thefile']['error'] === UPLOAD_ERR_OK){

因为我认为这是了解用户上传文件或输入是否为空白的最佳方法。

if (isset($_FILE["thefile"]["name"])){