如果 PHP 创建文件夹(如果不存在)


PHP create folder if it does not exist

我正在创建一个中等大小的应用程序。

此应用程序由许多产品组成。

现在这些产品有很多图片(一个产品可以有5-6张图片)

为了尝试进行某种排序,我想为每个产品创建一个文件夹,此文件夹包含绑定到该产品的所有图像。

到目前为止,我已经尝试了以下方法:

move_uploaded_file($file, APP.'product_images/'.$product_id.'/'.$image['name']);

但是,当我尝试此操作时,出现以下错误:

Warning (2): move_uploaded_file(/var/www/udlejnings-priser/cake/app/product_images/22/afterClick.png): failed to open stream: No such file or directory [APP/Controller/ImagesController.php, line 56]
Warning (2): move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/php472ci6' to '/var/www/udlejnings-priser/cake/app/product_images/22/afterClick.png' [APP/Controller/ImagesController.php, line 56]

现在我不是一个完全的菜鸟,知道这意味着我缺少对该文件夹的权限。

但是,问题是,如果该文件夹不存在(即这是该产品的图片首次上传),则应创建一个新文件夹。

我的问题是两部分。

    如果新文件夹
  1. 尚不存在,这会自动创建一个新文件夹吗?
  2. 如何向新创建的文件夹授予权限以避免此问题?

[我] 知道这意味着我缺少对该文件夹的权限。

实际上没有=)。错误消息如下:

无法打开流:没有此类文件或目录

这没有引用问题的权限:您尝试写入的包含文件夹不存在。

如果新文件夹

尚不存在,这会自动创建一个新文件夹吗?

不。

如何授予对新创建的文件夹的权限?

没有必要这样做 - 创建的任何内容都将具有正确的权限,以允许 Web 服务器用户读取文件。但是,首先有必要尝试创建一个文件夹,但问题并非如此。

使用 CakePHP,Folder 类可用于执行此操作:

App::uses('Folder', 'Utility');
$dir = new Folder('/path/to/folder', 2);

第二个参数用于创建新文件夹(如果不存在)。在问题的上下文中,这意味着代码将如下所示:

function whatever() {
    if ($this->request->data) {
        ...
        
        $unused = new Folder(APP.'product_images/'.$product_id, true);
        if (move_uploaded_file($file, APP.'product_images/'.$product_id.'/'.$image['name'])) {
            ...
        } else {
            ...
        }
    }
}

文件夹APP/product_images应该已经存在,并且必须具有权限,以便Web服务器用户(例如apache)可以写入它,否则将无法创建子文件夹/上传文件。假设APP/product_images存在并且 Web 服务器用户有权写入它,则无需修改上传文件的权限 - 默认情况下,用户创建的文件可由该用户读取。

试试这个:

if (!file_exists('path/to/directory')) {
    mkdir('path/to/directory', 0777, true);
}

1)如果不存在,这会自动创建一个新文件夹吗?=> file_existsMKDIR

2)如何向新创建的文件夹授予权限以避免此问题=> 0777

  1. 否,它不会动态创建文件夹。
  2. 使用chmod()更改权限。

为了检查某些文件夹是否存在,您也可以使用is_dir()

一种更防弹的方式来获得您想要的权限:

$path = 'path/to/directory';
if (! is_dir($path)) {
    $oldmask = umask(0);
    mkdir($path, 0755, true);
    umask($oldmask);
    clearstatcache();
}

mkdir() 的第三个参数也将在目录上方创建任何不存在的目录。

权限 0755 通常推荐用于 PHP 目录(前导 0 是必需的)。设置为 0777 的目录在大多数主机上无法访问。

clearstatcache() 调用仅在您将多次使用该目录时才是必需的,看起来您确实如此。

添加魔术常量也总是一个好主意 __DIR__到文件或目录路径。 ( __DIR__ 给出脚本所在目录的路径)。在错误消息中,"APP"以与路径名不同的颜色突出显示。这可能是无法找到路径的提示。