Drupal file_copy ne fonctionne pas

11

J'ai le code suivant:

$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);
}

Y a-t-il un problème avec mon code? Je reçois toujours le message de la commande die dans la dernière instruction if.

Toute aide serait appréciée.

Edit: Merci à Stanislav Agapov, j'ai trouvé les journaux de drupal. Le message est:

Le fichier .... / main_ROSE2106.JPG n'a pas pu être copié, car le répertoire de destination public: // galerii_imagini n'est pas configuré correctement.

Que dois-je faire pour le configurer correctement? J'ai défini dans / admin / config / media / file-system le chemin sites / default / files en tant que fichiers publics. Y a-t-il autre chose à régler?

Edit # 2: J'ai défini 777 pour l'ensemble de l'arborescence / sites / default / files.

sebastian.roibu
la source
2
Fonction file_copyet appelée par elle file_unmanaged_copyen cas d'erreurs écrire des messages dans le journal système. Avez-vous consulté le rapport "Messages de journal récents"? Vous y trouverez très probablement une réponse ...
Stanislav Agapov
Vérifiez que votre répertoire de fichiers est accessible en écriture ou non. Sinon, donnez-lui l'autorisation d'écrire.
Le dossier de fichiers a 777 droits.
sebastian.roibu
Que diriez-vous de l'autorisation de répertoire sur /sites/default/files/galerii_imagini?
Jimmy Ko
2
@applecrusher C'est un très mauvais conseil.

Réponses:

1

Êtes-vous certain que le chemin sites/default/files/galerii_imagini existe et qu'il s'agit d'un répertoire? Vous pouvez voir cette erreur si elle n'existe pas ou si elle existe mais est un fichier au lieu d'un répertoire. Si vous vous attendez à ce que Drupal crée le galerii_imaginirépertoire, vous devez ajouter cette ligne avant votre appel à file_copy:

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

Basé sur une recherche du code source de Drupal 7.x, le message File %file could not be copied, because the destination directory %destination is not configured correctly.n'est produit que dans file_unmanaged_copy, qui est appelé par file_copy. Il appelle d' file_prepare_directoryabord la destination telle que transmise à file_copy, puis son répertoire parent. Il produit le message d'erreur que vous voyez uniquement si les deux appels échouent. Puisqu'il appelle file_prepare_directoryavec des indicateurs par défaut, il peut échouer avec ce message si:

  • ni le chemin de destination ni son répertoire parent n'existent
  • le chemin de destination n'existe pas et son répertoire parent existe mais n'est pas un répertoire
  • le chemin de destination ou son répertoire parent existe, est un répertoire, n'est pas accessible en écriture et la modification de ses autorisations pour le rendre accessible en écriture a échoué

Dans le dernier cas, cependant, vous verriez un autre message dans le journal immédiatement avant celui que vous avez signalé dans votre question: The file permissions could not be set on %uri.comme vous n'avez pas signalé avoir vu ce message, je peux seulement supposer que l'un des deux premiers cas est correct.


la source
"galerii_imagini" existe et c'est un répertoire. Est accessible en écriture par drupal car je peux créer des galeries manuelles qui stockent les images dans ce répertoire. Parce que je suis sur un hébergement partagé et que j'ai eu un problème de droits dans le passé, je ne suis pas sûr que ce que je vois dans la filezilla soit correct, en ce qui concerne les droits.
sebastian.roibu