Système de fichier

Répertoire de fichiers

Emplacement

Le répertoire de fichiers de Elgg est situé dans le dataroot du site, configuré pendant l’installation, et qui peut être modifié via les paramètres du site dans l’interface Admin.

Structure du répertoire

La structure du répertoire de fichiers est liée à la propriété des fichiers par les entités Elgg. Chaque fois que le premier fichier appartenant à une entité est écrit dans le répertoire de fichiers, un répertoire correspondant au GUID de l’entité sera créé dans le répertoire bucket parent (les buckets sont de 5000 guids). Par exemple, les fichiers appartenant à l’utilisateur avec le guid 7777 seront situés dans 5000/7777/.

Lorsque des fichiers sont créés, les noms de fichiers peuvent contenir des noms de sous-répertoires (souvent appelés $prefix dans le code). Par exemple, les avatars de l’utilisateur ci-dessus, peuvent être trouvés dans 5000/7777/profile/.

Objets Fichier - File

Écrire des fichiers

Pour écrire un fichier dans le répertoire de fichiers, vous utiliseriez une instance de ElggFile. Même si ElggFile étend ElggObject et peut être stocké comme une entité Elgg réelle, ce n’est pas toujours nécessaire (par exemple pour la création des miniatures d’une image).

$file = new ElggFile();
$file->owner_guid = 7777;
$file->setFilename('portfolio/files/sample.txt');
$file->open('write');
$file->write('Contents of the file');
$file->close();

// to uprade this file to an entity
$file->save();

Lire des fichiers

Vous pouvez lire le contenu du fichier en utilisant une instance de ElggFile.

// from an Elgg entity
$file = get_entity($file_guid);
readfile($file->getFilenameOnFilestore());
// arbitrary file on the filestore
$file = new ElggFile();
$file->owner_guid = 7777;
$file->setFilename('portfolio/files/sample.txt');

// option 1
$file->open('read');
$contents = $file->grabFile();
$file->close();

// option 2
$contents = file_get_contents($file->getFilenameOnFilestore());

Servir des fichiers

Vous pouvez servir des fichiers depuis le répertoire de fichiers en utilisant elgg_get_inline_url() et elgg_get_download_url(). Les deux fonctions acceptent 3 arguments :

  • ``file`` Une instance de ElggFile à servir

  • ``use_cookie`` Si défini à true, la validité de l’URL sera limitée à la session actuelle

  • ``expires`` Temps d’expiration de l’URL

Vous pouvez utiliser les arguments use_cookie et expires comme moyen de contrôle d’accès. Par exemple, dans la plupart des cas, les avatars des utilisateurs ont un long délai d’expiration et n’ont pas besoin d’être limités à la session en cours - ce qui permettra aux navigateurs de mettre en cache les images. Le service de fichiers enverra les en-têtes Not Modified appropriés aux requêtes suivantes.

Le comportement par défaut de use_cookie peut être contrôlé sur la page des paramètres de sécurité de l’administrateur.

Pour les entités qui utilisent le contrôle d’accès de Elgg, vous pouvez utiliser des cookies pour vous assurer que les paramètres d’accès sont respectés et que les utilisateurs ne partagent pas les URLs de téléchargement avec d’autres personnes.

Vous pouvez également invalider toutes les URLs précédemment générées en mettant à jour l’heure de modification du fichier, par exemple à l’aide de touch().

Intégrer des fichiers

Veuillez noter qu’en raison de leur nature, les URLs en ligne - inline - et de téléchargement ne sont pas adaptées à l’intégration - embed. Les URLs d’intégration doivent être permanentes, tandis que les URLs en ligne et de téléchargement sont volatiles (liées à la session utilisateur et à l’heure de modification des fichiers).

Pour intégrer une icône d’entité, utilisez elgg_get_embed_url().

Gérer l’envoi de fichiers

Pour implémenter une action qui enregistre un unique fichier envoyé par un utilisateur, vous pouvez utiliser l’approche suivante :

// in your form
echo elgg_view('input/file', [
        'name' => 'upload',
        'label' => 'Select an image to upload',
        'help' => 'Only jpeg, gif and png images are supported',
]);
// in your action
$uploaded_file = elgg_get_uploaded_file('upload');
if (!$uploaded_file) {
        return elgg_error_response("No file was uploaded");
}

$supported_mimes = [
        'image/jpeg',
        'image/png',
        'image/gif',
];

$mime_type = elgg()->mimetype->getMimeType($uploaded_file->getPathname());
if (!in_array($mime_type, $supported_mimes)) {
        return elgg_error_response("{$mime_type} is not supported");
}

$file = new ElggFile();
$file->owner_guid = elgg_get_logged_in_user_guid();
if ($file->acceptUploadedFile($uploaded_file)) {
        $file->save();
}

Si votre champ de saisie de fichiers supporte plusieurs fichiers, vous pouvez les parcourir dans votre action :

// in your form
echo elgg_view('input/file', [
        'name' => 'upload[]',
        'multiple' => true,
        'label' => 'Select images to upload',
]);
// in your action
foreach (elgg_get_uploaded_files('upload') as $upload) {
        $file = new ElggFile();
        $file->owner_guid = elgg_get_logged_in_user_guid();
        if ($file->acceptUploadedFile($upload)) {
                $file->save();
        }
}

Note

Si des images sont chargées une tentative est faite pour corriger automatiquement l’orientation de l’image.

Fichiers temporaires

Si jamais vous avez besoin d’un fichier temporaire vous pouvez utiliser elgg_get_temp_file(). Vous obtiendrez une instance de ElggTempFile qui a toutes les fonctions de ElggFile, mais écrit ses données dans le répertoire temporaire du système.

Avertissement

Il n’est pas possible d’enregistrer ElggTempFile dans la base de données. Vous obtiendrez une Elgg\Exceptions\Filesystem\IOException si vous essayez.