【问题标题】:PHP album: move_uploaded_file does not workPHP 相册:move_uploaded_file 不起作用
【发布时间】:2014-11-11 06:27:31
【问题描述】:

我是 php 初学者,需要帮助。

我正在处理一个简单的相册并尝试将照片上传到我从选项中选择的相册文件夹,但收到错误消息“没有这样的文件或目录”和“无法移动”。

我尝试将路径中的“$album_name”部分更改为“$row['name']”或“$album_id”,但它们都不起作用。但是,设置一个固定的 url 是可行的(例如 'uploads/bla/'.$random_name.'.jpg')。

如何在路径中包含我从选项中选择的专辑名称?当前上传的文件存储在文件夹之外(在“uploads”文件夹中)。


 <form enctype='multipart/form-data' method='post'>

    Select album: <br/>              
    <select name='album'>
    <?php
    $query = mysqli_query($dbc, "SELECT id, name FROM albums ORDER BY id DESC");

    while($row = mysqli_fetch_array($query)) {
      $album_id = $row['id'];
      $album_name = $row['name'];
      echo "<option value=".$album_id.">".$album_name."</option>";
    }
    ?>
    </select><br/><br/>  

    <?php
      if(isset($_POST['upload'])) {

        $album_id = $_POST['album'];
        $file = $_FILES['file']['name'];
        $file_tmp = $_FILES['file']['tmp_name'];
        $random_name = rand();

        if(empty($file)) { 
          echo "Please choose a file to upload.<br/> <br/>";
        } else {

          move_uploaded_file($file_tmp, 'uploads/'.**$album_name**.'/'.$random_name.'.jpg');

          mysqli_query ($dbc, "INSERT INTO pictures VALUES('', '$album_id', '$random_name.jpg')");
          echo "Photo uploaded!!!<br/> <br/> ";
        }
      }
    ?>

   Select photo: <br/>
    <input type='file' name='file' /><br/><br/>
    <input type='submit' name='upload' value='Upload' />
  </form>   

【问题讨论】:

  • m_u_f() 不会为您创建子目录。如果uploads/$album_name 尚不存在,则移动将失败。并注意$rand.jpg NOT 是一个好用的文件名。 rand() 可以/将生成相同的数字。您应该使用您的数据库记录的主键(例如 auto_increment int),该主键将是唯一且不可重复的。
  • 感谢您的提示。我将尝试创建子目录并使用主键而不是 rand()。

标签: php


【解决方案1】:

当您遇到此类错误时,需要考虑很多事情。

  1. 目录是否存在? “上传”目录可能有另一个名称。
  2. 目录是否有正确的 chmod?如果你在 Windows 上开发,那没问题。但是在 Linux 上,一旦目录为 0600 并且所有者是您的用户,它就是一个大问题。在这种情况下,要么将目录 chmod 为 0777(这可能存在巨大的安全风险),要么将所有者更改为 daemon 或运行 Apache(或您的网络服务器)的用户。
  3. 文件大小大于 php.ini 中的指令。是的,PHP 有一个配置文件 php.ini,其中设置了最大上传文件大小。如果您在 Linux 上运行 find / -name php.ini 来查找文件。默认情况下,最大文件大小为 2MB。

您还应该尝试通过$_FILE["file"]["error"] 处理错误以查看更详细的错误。错误列表可在此处的官方 PHP 文档中找到:http://php.net/manual/en/features.file-upload.errors.php

【讨论】:

  • 0774 是的...0777 没那么多
  • 我没有得到你的评论。您是在暗示chmod 0774 存在安全风险,而chmod 0777“没那么多”吗?很遗憾地告诉你,0774 将意味着其他人只能读取,但不能写入和执行,这不会带来安全风险。如果您建议用户应该在目录上使用chmod 0774 来上传图像,那么我仍然很遗憾地告诉您,如果该目录属于用户 Debian (例如),由于权限不足,用户 daemon(Apache 使用)将无法上传他的文件。
  • 我告诉你应该把0774放在目录上,0664放在文件上。如果您的脚本无法从那里上传,那么很抱歉告诉您您的服务器配置错误。
猜你喜欢
  • 1970-01-01
  • 2019-04-09
  • 2016-12-14
  • 2016-10-01
  • 2018-07-06
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
相关资源
最近更新 更多