Paillasse/portail/app/Services/Stockage/StockageTravauxEleves.php

59 lines
1.8 KiB
PHP
Raw Permalink Normal View History

<?php
namespace App\Services\Stockage;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
/**
* Stockage des rendus de devoirs maison sur Object Storage (bloc B,
* Hetzner, 2026-10-14) : jamais sur le disque du serveur. Le bouton de
* dépôt de fichier n'apparaît que si le disque est vraiment configuré
* (CLAUDE.md : pas de fonction qui a l'air de marcher sans vraiment
* marcher) — tant qu'Adam n'a pas créé le bucket, seul le texte libre
* reste proposé.
*/
class StockageTravauxEleves
{
public const TAILLE_MAX_OCTETS = 10 * 1024 * 1024; // 10 Mo
public const EXTENSIONS_ACCEPTEES = ['pdf', 'doc', 'docx', 'odt', 'txt', 'png', 'jpg', 'jpeg', 'zip'];
public static function disponible(): bool
{
return filled(config('filesystems.disks.s3.bucket'));
}
/**
* @return array{chemin: string, nom_original: string, taille_octets: int}
*/
public static function stocker(UploadedFile $fichier, string $devoirId, string $eleveId): array
{
$chemin = $fichier->storeAs(
"devoirs/{$devoirId}/{$eleveId}",
now()->format('Ymd-His').'-'.Str::random(8).'.'.$fichier->getClientOriginalExtension(),
's3'
);
return [
'chemin' => $chemin,
'nom_original' => $fichier->getClientOriginalName(),
'taille_octets' => $fichier->getSize(),
];
}
public static function supprimer(?string $chemin): void
{
if ($chemin !== null) {
Storage::disk('s3')->delete($chemin);
}
}
/** Lien valable 5 minutes, jamais le fichier servi en clair par le portail. */
public static function urlTemporaire(string $chemin): string
{
return Storage::disk('s3')->temporaryUrl($chemin, now()->addMinutes(5));
}
}