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.