如果文件夹不存在,PHP创建文件夹。

4
我正在创建一个中等规模的应用程序。
这个应用程序包含很多产品。
现在,这些产品有许多图像(一个产品可以有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. 如何给新创建的文件夹授权,以避免出现此问题?
5个回答

6
我知道这意味着我缺少访问该文件夹的权限。
实际上不是这样的 =)。错误消息显示为:
无法打开流:没有此类文件或目录
这没有涉及到许可问题,而是因为你试图写入的包含文件夹不存在。
这会自动创建一个新文件夹吗?
不会。
如何给新创建的文件夹授权?
不需要这样做 - 任何创建的内容都将具有正确的权限,以允许Web服务器用户读取文件。但首先需要尝试并创建一个文件夹,在问题中并非如此。
使用CakePHP,可以使用Folder class来执行此操作:
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 服务器用户拥有写入权限,则无需修改上传文件的权限 - 用户创建的文件默认情况下可被该用户读取。


4

试试这个:

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

1)如果文件夹不存在,它是否会自动创建一个新的文件夹? => file_existsmkdir

2)我如何给新创建的文件夹授予权限,以避免这个问题? => 0777


3
推荐使用 0777 权限,特别是为了解决根本不存在的权限问题,这是个不好的建议。 - AD7six

0

获取您想要的权限的更可靠方法:

$path = 'path/to/directory';

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

mkdir()的第三个参数还会创建任何不存在的目录。

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

如果您将多次使用该目录,则需要调用clearstatcache()函数,这似乎是您的情况。


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

要检查某个文件夹是否存在,也可以使用 is_dir()


-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接