1

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

首先,这里有一些信息:

  • 我确实multipart/form-data在我的表单中将 enctype 设置为“”
  • 上传文件大小在 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 日志中没有错误。我在每次测试中都用 tail -f 观看

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

提前致谢。

4

3 回答 3

0

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

move_uploaded_file()既是安全模式又是 open_basedir 感知的。但是,仅对目标路径设置了限制,以允许移动文件名可能与此类限制冲突的上传文件。move_uploaded_file() 仅允许移动通过 PHP 上传的文件,从而确保此操作的安全性。

所以检查你的 open_basedir 设置是什么,如果你的目录不低于 open_basedir 将它移动到 open_basedir 值位置下方。

希望能帮助到你。

于 2013-06-23T17:52:21.567 回答
0

错误可能来自

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

显示您的实际文件脚本的路径...它需要是相对路径...我猜您不在 /home/ 之前的文件夹中

也许应该是这样的 $dir = './public/files/images';

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

于 2013-06-23T16:58:56.700 回答
0

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

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

您也可以尝试copy()功能只是为了验证它不是move_uploaded_file()功能问题。

于 2013-06-23T18:56:22.423 回答