move_uploaded_file导致错误的奇怪行为

时间:2013-06-23 16:27:06

标签: php upload

尝试通过PHP脚本上传文件时,我确实有一种非常奇怪的行为。

首先,这里有几个信息:

  • 我确实在我的表单中将enctype设置为“multipart/form-data
  • 在apache config
  • 中将上传文件大小设置为20M
  • 我的上传目录/home/www/public/files/images有一个777 chmod

    ls -l /home/www/public/files/
    total 68K
    drwxrwxrwx. 90 pel pel 64K juin  23 18:06 images
    

现在,这是我使用的代码:

    if (!empty($_FILES['image'])) {

        $dir =  '/home/www/public/files/images';
        $extension = mb_strtolower(pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION));
        $newfile_name = 'myimage-with-my-name.' . $extension;
        $newfile_path = $dir . '/' . $newfile_name;

        if (!is_writable($dir)) {
            throw new Exception('Upload: Cant write in ' . myescape($dir));
        }
        if (!in_array($extension, array('png', 'gif', 'jpg', 'jpeg'))) {
            throw new Exception('Upload: Unsupported extension ' . myescape($extension));
        }
        if ($_FILES['image']['error'] > 0) {
            throw new Exception('Upload: Error code ' . myescape($_FILES['image']['error']));
        }

        print_r($_FILES['image']);
        print_r(array($_FILES['image']['tmp_name'], $newfile_path));

        if (!move_uploaded_file($_FILES['image']['tmp_name'], $newfile_path)) {
            die('ERROR: Upload Failed');
        }
    }

结果如下:

    Array
    (
        [name] => sampleimage.jpg
        [type] => image/jpeg
        [tmp_name] => /tmp/phpaLjZyD
        [error] => 0
        [size] => 11721
    )

    Array
    (
        [0] => /tmp/phpaLjZyD
        [1] => /home/www/public/files/images/myimage-with-my-name.jpg
    )

    Error: Upload Failed

如您所见,没有错误,没有抛出“先前”异常(is_write,extension ...),最后move_uploaded_file失败。

奇怪的行为是:

  • move_uploaded_file返回false
  • 上传的图片名称为sampleimage.jpg,而不是我想要的myimage-with-my-name.jpg
  • apache2日志中没有错误。我在每次测试中都用尾巴-f观看

您有解决此问题的提示或解决方案吗?

提前致谢。

3 个答案:

答案 0 :(得分:0)

错误可能来自

 $dir =  '/home/www/public/files/images';

显示实际文件脚本的路径... 它需要是一个相对路径...我猜你在/ home /

之前不在文件夹上

也许它应该像$dir = './public/files/images';

此外,您应该使用if (!empty($_FILES['image']['name']))

答案 1 :(得分:0)

正如php.net move_uploaded_file()所述,open_basedir知道。

move_uploaded_file()既是安全模式,也是open_basedir。但是,仅限于目标路径上的限制,以允许移动文件名可能与此类限制冲突的上载文件。 move_uploaded_file()通过仅允许移动通过PHP上传的文件来确保此操作的安全性。

请检查您的open_basedir设置为什么,如果您的目录不在open_basedir之下,请将其移至open_basedir值位置以下。

希望它有所帮助。

答案 2 :(得分:0)

您确定move_uploaded_file()功能问题。您可以检查php错误日志或在脚本error_reporting(E_ALL)中设置。

apache日志中没有错误,因为文件没有错误 - [error] => 0且大小为[size] => 11721。您需要检查PHP错误日志。

此外,您可以尝试使用copy()函数来验证move_uploaded_file()函数不存在问题。