【问题标题】:PHP: move_uploaded_file() failed to open stream: No such file or directoryPHP:move_uploaded_file() 无法打开流:没有这样的文件或目录
【发布时间】:2026-01-20 11:00:02
【问题描述】:

我正在尝试让 PHP 将上传的文件从 tmp 目录移动到我的网络服务器上的某个永久位置。看起来很简单,但我收到了这个错误:

Unable to move 'C:\UniServer\tmp\php3F62.tmp' to 'static/images/slides/1/1.jpg'

很简单,对吧?找不到目标文件夹。

我的问题是:如何引用所需的目标目录?

引用是否相对于脚本在服务器上的位置?还是相对于 URL?还是PHP DOCUMENT_ROOT?还是操作系统的文件系统?还是别的什么?

我无法在 PHP 文档中找到答案,或者在 SO 上的任何类似问题中都找不到答案。

有人可以帮忙吗?谢谢。

【问题讨论】:

  • 这是脚本在服务器上的位置。最好始终使用绝对路径
  • 在路径上使用DIRECTORY_SEPARATOR 常量使其独立于平台。
  • 经常会遇到这个错误,要快速解决它,请按照以下步骤操作:*.com/a/36577021/2873507

标签: php apache file-upload


【解决方案1】:

我认为这将对您有所帮助而不会给您任何错误:

$image = $_FILES['image']['name'];
$image_temp =$_FILES['image']['tmp_name'];
$target='C:/xampp/htdocs/jer/images/'.basename($_FILES['image']['name']);
move_uploaded_file($image_temp, "$target");
insert into images (images) values ('$target');

【讨论】:

    【解决方案2】:
    $destination = dirname(dirname(dirname(dirname(__FILE__))))."/runtime/tmp/";
    chown($destination, 0755);
    move_uploaded_file($info['tmp_name'], $destination.$info['name']);
    

    这是我的解决方案,我只是使用 mkdir 创建一个目录来放置我想要移动的图片。 希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      它来自脚本在服务器上的位置!此外,您需要在此文件夹中具有写入权限:

      'static/images/slides/1/1.jpg'
      

      最好以这种方式使用绝对路径:

      'C:\UniServer\***\static\images\slides\1\1.jpg
      

      使用绝对路径。

      【讨论】:

      • @DjangoReinhardt 感谢您提供信息,但要格外小心,了解操作系统。 :)
      • 不知道,但可能是因为您仍然有关于 Windows 的错误信息?我也对这个问题投了反对票。
      • 现在有一个针对此常见错误的故障排除清单:*.com/a/36577021/2873507
      【解决方案4】:

      我在上传时遇到了同样的问题。看看我的例子,也许它可以帮助你。

      我创建的文件名为“uploads”。

      $uploads_dir = 'uploads/';
      $name = $_FILES['userfile']['name'];
      if (is_uploaded_file($_FILES['userfile']['tmp_name']))
      {       
          //in case you want to move  the file in uploads directory
           move_uploaded_file($_FILES['userfile']['tmp_name'], $uploads_dir.$name);
           echo 'moved file to destination directory';
           exit;
      }
      

      【讨论】:

        【解决方案5】:

        跟踪路径的一种简单方法是在 index.php 中定义绝对路径

        define ('SITE_ROOT', realpath(dirname(__FILE__)));
        

        然后像这样使用它:

        move_uploaded_file($_FILES['file']['tmp_name'], SITE_ROOT.'/static/images/slides/1/1.jpg');
        

        【讨论】:

        • 这也是我的做法。这比使用 doc root 更好,因为这样,您可以将您的应用程序放在子目录中
        • 这是正确的解决方案,谢谢! (有些人认为 DIRECTORY_SEPARATOR 会有所帮助,这有点令人担忧:-/)
        • 我从未使用过它,只有在我要向用户输出路径时才使用它。感谢您的接受:)
        • 只是一个疑问...不是 $_FILES['file']['tmp_name'] 而不是 $_FILES['file']['temp_name']
        • 现在有一个针对此常见错误的故障排除清单:*.com/a/36577021/2873507