PHP:目录名+文件名

4
我正在编写一个用PHP上传文件的表单。这是我的输入框:
 $file_name = filter_input(INPUT_POST, 'file_name');
 $file = filter_input(INPUT_POST, 'file');
 $file_date = filter_input(INPUT_POST, 'premiere_date');
 $file_director = filter_input(INPUT_POST, 'director_name');

我不知道自己哪里做错了,以下是具体情况:

if ((filter_input(INPUT_POST, 'submit'))) { //if submit button is clicked
      $target_dir = "uploads/";
    $target_file = $target_dir . basename($_FILES["file"]["file_name"]);
     move_uploaded_file($_FILES["file"]["tmp_name"], $target_file);    
     echo $target_file;
}

这是HTML

 <form id="savingFiles" action="upload.php" method="post" enctype="multipart/form-data">
            <label>Name of the file:</label>
            <input type="text" name="file_name" value="<?php if (isset($row['file_name'])) {
    echo $row['file_name'];
} ?>"/>
            <br>
              <label>Select your file:</label> 
              <input type="file" name="file" value="<?php if (isset($row['file'])) {
    echo $row['file'];
} ?>"/>
              <br>Date of premiere:
                <input type="date" name="premiere_date" value="<?php if (isset($row['premiere_date'])) {
    echo $row['premiere_date'];

} ?>"/> 
                <br>
                  <label>Name of the director:</label>
            <input type="text" name="director_name" value="<?php if (isset($row['director_name'])) {
    echo $row['director_name'];
} ?>"/>
             <br>
                  <button type="submit" value="submit" name="submit">Upload file</button>
                  </form>

                  <?php
                  //Table with records
                  $sql = "SELECT myFilms.id, file_name, file, premiere_date, director_name FROM myFilms JOIN myFilms_directors ON myFilms.director_id = myFilms_directors.id";
                 /*for mysqlia
                  *  $result = $conn->query($sql);
                  */
                  /*for mysql (old)*/
                    $result = mysql_query($sql);

                  if ($result) {

                      echo "<table border='1' id='filesResults'><tr><th>FILE ID</th><th>FILE NAME</th><th>FILE</th><th>PREMIERE DATE</th><th>DIRECTOR NAME</th></tr>";


                      /* in mysqli 
                       * while ($row = $result->fetch_assoc()) */
                      /*for mysql (old)*/
                       while ($row =  mysql_fetch_array($result)) {

                          echo '<tr><td>' . $row['id'] . '</td><td>' . $row['file_name'] . '</td><td><a href= "'. $row['file']. ' ">view file</a></td><td>' . $row['premiere_date'] . '</td><td>' . $row['director_name'] . '</td></tr>';
                      }
                      echo "</table>";
                  } else {
                      echo "there is not data on the table";
                  }
                  /*for mysqli
                  $conn->close();            
                   */
                  /*for mysql (old)*/
                  mysql_close($dbhandle);

                  ?>

因此,当我echo $target_file时,我期望它在这种情况下是uploads/nameOfTheFile.pdf的路径,但它只显示为uploads/。所以$target_dir,我是否正确使用basename函数?我已经在w3schools上检查了它,对我来说似乎是正确的,但肯定有些问题...

谢谢大家!!


如果您调用 var_dump(basename($_FILES["file"]["file_name"]));,您会得到什么? - Scott
关于双括号的问题,你问得好。那是一个错误,但它并不会改变结果,还是谢谢你! - eve_mf
使用basename之前带上var_dump,我得到了string(0) "",这是什么意思?我是编程新手,所以一切都看起来很困难和难以理解! - eve_mf
现在去掉基本名称(basename)它会显示 NULL :( - eve_mf
var_dump($_FILES) 给出以下结果:array(1) { ["file"]=> array(5) { ["name"]=> string(14) "plugin wp.docx" ["type"]=> string(71) "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ["tmp_name"]=> string(18) "/var/tmp/phpcoayaU" ["error"]=> int(0) ["size"]=> int(262453) } }你能解释一下这里的内容吗? - eve_mf
显示剩余3条评论
4个回答

4

更改为
$target_file = $target_dir . basename($_FILES["file"]["name"]);
应该可以正常工作。


1

$_FILES是一个关联数组,包含以下内容:

Array ( [name] => 
 [type] => some value 
[tmp_name] => some value
error] => some value 
[size] => some value
)

$_FILES["file"]["file_name"] 改为 $_FILES["file"]["name"]

谢谢你,Chayan!它确实起作用了!但是...你能解释一下为什么吗?因为我的数据库中没有任何“name”列:S,它被称为file_name。 - eve_mf

1
使用 var_dump($_FILES) 可以让您查看整个 PHP $_FILES 关联数组。如下所示:
array(1) { 
    ["file"]=> array(5) { 
        ["name"]=> string(14) "plugin wp.docx" 
        ["type"]=> string(71) "application/vnd.openxmlformats-officedocument.wordprocessingml.document" 
        ["tmp_name"]=> string(18) "/var/tmp/phpcoayaU" 
        ["error"]=> int(0) 
        ["size"]=> int(262453) 
    } 
}

$_FILES 包含一个名为 'file' 的关联数组,该数组有 5 个索引:nametypetmp_nameerrorsize

您正在分配:

$target_file = $target_dir . basename($_FILES["file"]["file_name"]);

上面提到的对象是错误的,因为["file_name"]不是file的一部分。查看调试信息后,解决方案应该很明显,只需将["file_name"]更改为["name"]

 $target_file = $target_dir . basename($_FILES["file"]["name"]);

关于 PHP var_dump() 的一些信息 在这里,因为您似乎不知道这个函数。


0

你的输入文件标签与名称字段关联,名称为“file”。

Instead of using $_FILES["file"]["file_name"] use this $_FILES["file"]["file"]

希望这对你有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接