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. 如何授予新创建的文件夹权限以避免此问题?
4

4 回答 4

5

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

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

无法打开流:没有这样的文件或目录

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

如果它尚不存在,这是否会自动创建一个新文件夹?

不。

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

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

使用 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应该已经存在,并且必须具有权限,以便网络服务器用户(例如 apache)可以对其进行写入,否则将无法创建子文件夹/上传文件。假设APP/product_images存在并且网络服务器用户有权对其进行写入,则无需修改上传文件的权限 - 用户创建的文件默认情况下可由该用户读取。

于 2013-10-26T17:29:27.077 回答
4

尝试这个:

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

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

2)我怎样才能给一个新创建的文件夹权限,这样我才能避免这个问题=> 0777

于 2013-10-26T17:17:12.420 回答
0
  1. 不,它不会动态创建文件夹。
  2. 用于chmod()更改权限。

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

于 2013-10-26T17:18:06.283 回答
0

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

于 2018-05-07T15:59:17.490 回答