Drupal file_copy не работает

11

У меня есть следующий код:

$main_image = glob('main*.{jpeg,gif,png,jpg,JPEG,JPG,PNG}', GLOB_BRACE);
if (count($main_image) != 1) 
    die("Could not find main picture !");  

$file_path = drupal_realpath($main_image[0]);
$file = (object) array(
            'uid' => $userID,
            'uri' => $file_path,
            'filemime' => file_get_mimetype($file_path),
            'display' => 1,
            'filename' => $main_image[0]
);
// copy the file in the correct folder
$destination = "public://galerii_imagini/" . $file->filename;
 if ($file = file_copy($file, $destination, FILE_EXISTS_REPLACE)) {} else {
    die("Could not copy " . $file_path . " in " . $destination);
}

Что-то не так с моим кодом? Я всегда получаю сообщение от команды die внутри последнего оператора if.

Любая помощь будет оценена.

Редактировать: Благодаря Станиславу Агапову, я нашел журналы от drupal. Сообщение:

Не удалось скопировать файл .... / main_ROSE2106.JPG, поскольку целевой каталог public: // galerii_imagini настроен неправильно.

Что я должен сделать, чтобы правильно его настроить? Я установил в / admin / config / media / file-system путь сайтов / default / files как публичные файлы. Есть что-то еще, чтобы установить?

Редактирование # 2: я установил 777 для всего дерева / sites / default / files.

sebastian.roibu
источник
2
Функция file_copyи вызываемая ею функция file_unmanaged_copyв случае ошибок записывают сообщения в системный журнал. Вы смотрели отчет "Последние сообщения журнала"? Скорее всего, вы найдете ответ там ...
Станислав Агапов
Проверьте, что ваш каталог файлов доступен для записи или нет. Если нет, то дайте ему разрешение на запись.
Папка Files имеет 777 прав.
sebastian.roibu
Как насчет разрешения на каталог /sites/default/files/galerii_imagini?
Джимми Ко
2
@applecrusher Это очень плохой совет.

Ответы:

1

Вы уверены, что путь sites/default/files/galerii_imagini существует и является каталогом? Вы можете увидеть эту ошибку, если она не существует или существует, но представляет собой файл, а не каталог. Если вы ожидаете, что Drupal создаст galerii_imaginiкаталог, вам нужно добавить эту строку перед вызовом file_copy:

file_prepare_directory("public://galerii_imagini", FILE_CREATE_DIRECTORY);

Основываясь на поиске исходного кода Drupal 7.x, сообщение File %file could not be copied, because the destination directory %destination is not configured correctly.создается только в том случае file_unmanaged_copy, если оно вызывается file_copy. file_prepare_directoryСначала он вызывает пункт назначения в том виде, в котором он был передан file_copy, а затем родительский каталог. Он выдает сообщение об ошибке, которое вы видите только в случае сбоя обоих вызовов. Поскольку он вызывает file_prepare_directoryс флагами по умолчанию, он может потерпеть неудачу с этим сообщением, если:

  • ни целевой путь, ни его родительский каталог не существует
  • целевой путь не существует, и его родительский каталог существует, но не является каталогом
  • либо путь назначения или его родительский каталог существует, является каталогом, недоступным для записи, и изменение его разрешений, чтобы сделать его доступным для записи, не удалось

В последнем случае, однако, вы увидите другое сообщение в журнале непосредственно перед тем, которое вы сообщили в своем вопросе: The file permissions could not be set on %uri.поскольку вы не сообщали о том, что видели это сообщение, я могу только предположить, что один из первых двух случаев является правильным.


источник
"galerii_imagini" существует, и это каталог. Доступен для записи Drupal, потому что я могу создавать ручные галереи, которые хранят изображения в этом каталоге. Поскольку я нахожусь на виртуальном хостинге и у меня были проблемы с правами в прошлом, я не уверен, что то, что я вижу в filezilla, является правильным относительно прав.
sebastian.roibu