【问题标题】:PHP file upload to linux cPanel shows success but file is nowhere to be foundPHP文件上传到linux cPanel显示成功,但找不到文件
【发布时间】:2017-07-01 12:24:14
【问题描述】:

这是我在 stackoverflow 上的第一篇文章。我在此站点上搜索了此问题的其他解决方案,但找不到任何解决方案。我什至与 GoDaddy 支持进行了一次广泛的会议,但没有成功。

这是我的代码,它从 PHP 参考中略有修改:

<html>
<body>

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

if (isset($_POST['submit'])){
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
$tmpfile = $_FILES['userfile']['tmp_name'];

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'File name: '.$uploadfile."\r\n";
echo 'Temp file: '.$tmpfile."\r\n\r\n";
echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";
}
}
?>

<form enctype="multipart/form-data" action="#" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" name="submit" id="submit" value="Send File" />
</form>
</body>
</html>

我上传文件时的输出是这样的:

Warning:  move_uploaded_file(uploads/Bender.jpg): failed to open stream: No such file or directory in /home/nflaum/public_html/_working/file_upload.php on line 15



Warning:  move_uploaded_file(): Unable to move '/tmp/phpWmeSDx' to 'uploads/Bender.jpg' in /home/nflaum/public_html/_working/file_upload.php on line 15

Possible file upload attack! File name: uploads/Bender.jpg Temp file: /tmp/phpWmeSDx

Here is some more debugging info:Array (
    [userfile] => Array
        (
            [name] => Bender.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/phpWmeSDx
            [error] => 0
            [size] => 91463
        )

)

以下是我已经尝试过的事情:

  1. 创建了我自己的 php.ini 文件并尝试了所有可以想象的 upload_tmp_dir 组合(使用 phpinfo 验证),无论是我自己还是与 GoDaddy 代表一起。已验证 file_uploads 已开启,所有设置均正常。

  2. 验证文件夹对于每个尝试的组合都有 777 个权限。

  3. 尝试重命名 .htaccess 以防某些路由配置导致问题。

  4. 连接到 SSH 并检查根 /tmp 文件夹以查看它是否存在(GoDaddy 将主文件夹设置为 /home/)

这些都没有解决问题。看起来 PHP 认为文件已正确上传,但无处可寻。我希望这个论坛上的一位天才能够帮助我看到我错过的东西。

【问题讨论】:

  • 几个快速的想法,您是否尝试过为上传的文件使用绝对路径? move_uploaded_file() 也受 open_basedir 和 safe_mode 限制。
  • 我在通过我的提供商在共享主机上的 cPanel 上,但我尝试使用我的提供商分配给我的 /home/nflaum/。这是绝对的,因为我知道如何得到。另外,在执行 move_uploaded_file() 之前不应该存在 tmp 文件吗?据我了解,服务器上的 upload_tmp_dir 文件夹中应该有一个 tmp 文件。如果没有这个 tmp 文件,move_uploaded_file() 将始终失败,因为没有要移动的文件。

标签: php linux file-upload cpanel


【解决方案1】:

我认为从脚本当前位置开始的路径不正确。你检查了吗?文件夹“上传”是否在 file_upload.php 脚本的同一目录中?

【讨论】:

  • 那是我测试它的时候。从那以后,我一直专注于清理我的网站/目录结构,事情可能已经发生了变化。但即便如此,tmp 文件不应该仍然存在于 tmp 目录中吗?还是 tmp 就像内存中的某个点,并不代表实际文件?
  • 也许问题不是临时文件夹,而是“上传”文件夹。也许你的“上传”文件夹的路径是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2013-07-10
相关资源
最近更新 更多