cyla/share.php

218 lines
8.5 KiB
PHP

<?php
define('CYLA_CORE', true);
require_once 'core.php';
$error = null;
$file_info = null;
// Vérifier si un fichier est spécifié
if (!isset($_GET['file'])) {
$error = 'Aucun fichier spécifié';
} else {
$filename = $_GET['file'];
$path = $_GET['path'] ?? 'fichiers/';
// Déterminer le chemin complet selon le dossier
$basePath = '';
switch ($path) {
case 'v1/img/fichiers/':
$basePath = __DIR__ . '/v1/img/fichiers/';
break;
case 'v2/file/':
$basePath = __DIR__ . '/v2/file/';
break;
default:
$basePath = UPLOAD_DIR;
$path = 'fichiers/'; // Assurer que le path par défaut est correct
}
$filepath = $basePath . $filename;
// Vérifier que le fichier existe et est un fichier régulier
if (!file_exists($filepath) || !is_file($filepath)) {
$error = 'Fichier introuvable';
} else {
// Vérifier que le chemin est sécurisé
$realpath = realpath($filepath);
$allowed = false;
if (strpos($realpath, realpath(UPLOAD_DIR)) === 0) {
$allowed = true;
} else {
foreach (LEGACY_UPLOAD_DIRS as $dir) {
if (strpos($realpath, realpath($dir)) === 0) {
$allowed = true;
break;
}
}
}
if (!$allowed) {
$error = 'Accès non autorisé';
} else {
// Récupérer les informations du fichier
$file_info = [
'name' => $filename,
'size' => filesize($filepath),
'extension' => strtolower(pathinfo($filename, PATHINFO_EXTENSION)),
'preview_type' => getPreviewType(pathinfo($filename, PATHINFO_EXTENSION))
];
}
}
}
// Construction des URLs
$file_url = SITE_URL . $path . ($file_info ? rawurlencode($file_info['name']) : '');
$share_url = SITE_URL . 'share.php?file=' . ($file_info ? rawurlencode($file_info['name']) : '') . '&path=' . urlencode($path);
// Contenu de la page
$pageTitle = $file_info ? $file_info['name'] : 'Fichier introuvable';
ob_start(); ?>
<?php if ($error): ?>
<div class="card">
<h1>Erreur</h1>
<p><?php echo Cyla::escape($error); ?></p>
<a href="index.php" class="btn">Retour à l'accueil</a>
</div>
<?php else: ?>
<div class="share-container">
<div class="card">
<h1><?php echo Cyla::escape($file_info['name']); ?></h1>
<div class="file-meta">
<p>
Taille : <?php echo Cyla::escape(round($file_info['size'] / 1024, 2)); ?> Ko
· Type : <?php echo Cyla::escape(strtoupper($file_info['extension'])); ?>
</p>
</div>
<div class="preview-container">
<?php if ($file_info['preview_type'] === 'image'): ?>
<img src="<?php echo Cyla::escape($file_url); ?>"
alt="<?php echo Cyla::escape($file_info['name']); ?>"
class="preview-content">
<?php elseif ($file_info['preview_type'] === 'video'): ?>
<video controls class="preview-content">
<source src="<?php echo Cyla::escape($file_url); ?>"
type="video/<?php echo $file_info['extension'] === 'webm' ? 'webm' : 'mp4'; ?>">
Votre navigateur ne supporte pas la lecture de vidéos.
</video>
<?php elseif ($file_info['preview_type'] === 'audio'): ?>
<audio controls class="preview-content">
<source src="<?php echo Cyla::escape($file_url); ?>"
type="audio/<?php echo $file_info['extension']; ?>">
Votre navigateur ne supporte pas la lecture audio.
</audio>
<?php elseif ($file_info['preview_type'] === 'text'): ?>
<pre class="text-preview"><?php
// Lire et afficher le contenu du fichier texte de manière sécurisée
$content = file_get_contents($filepath);
if ($content !== false) {
echo Cyla::escape($content);
} else {
echo "Erreur lors de la lecture du fichier";
}
?></pre>
<?php else: ?>
<div class="no-preview">
<div class="extension-badge">
<?php echo Cyla::escape(strtoupper($file_info['extension'])); ?>
</div>
<p>Aperçu non disponible pour ce type de fichier</p>
</div>
<?php endif; ?>
</div>
<div class="share-actions">
<div class="share-link">
<label for="share-url">Lien de partage :</label>
<div class="input-group">
<input type="text"
id="share-url"
value="<?php echo Cyla::escape($share_url); ?>"
readonly>
<button class="btn" onclick="handleCopy('share-url', 'Lien de partage copié !')">
Copier
</button>
</div>
</div>
<div class="share-link">
<label for="direct-url">Lien direct :</label>
<div class="input-group">
<input type="text"
id="direct-url"
value="<?php echo Cyla::escape($file_url); ?>"
readonly>
<button class="btn" onclick="handleCopy('direct-url', 'Lien direct copié !')">
Copier
</button>
</div>
</div>
<?php if (in_array($file_info['preview_type'], ['image', 'video'])): ?>
<div class="share-link">
<label for="embed-code">Code d'intégration :</label>
<div class="input-group">
<input type="text"
id="embed-code"
value="<?php
if ($file_info['preview_type'] === 'image') {
echo Cyla::escape('<img src="' . $file_url . '" alt="' . $file_info['name'] . '">');
} else {
echo Cyla::escape('<video controls><source src="' . $file_url . '" type="video/' .
($file_info['extension'] === 'webm' ? 'webm' : 'mp4') . '"></video>');
}
?>"
readonly>
<button class="btn" onclick="handleCopy('embed-code', 'Code d\'intégration copié !')">
Copier
</button>
</div>
</div>
<?php endif; ?>
<a href="<?php echo Cyla::escape($file_url); ?>"
class="btn btn-secondary"
download="<?php echo Cyla::escape($file_info['name']); ?>">
Télécharger
</a>
</div>
</div>
</div>
<script>
// Fonction pour gérer la copie
async function handleCopy(elementId, message) {
const input = document.getElementById(elementId);
if (!input) {
console.error(`Element with id ${elementId} not found`);
return;
}
try {
// Utiliser l'API Clipboard moderne
await navigator.clipboard.writeText(input.value);
// Créer et afficher la notification
const notification = document.createElement('div');
notification.className = 'notification';
notification.textContent = message;
document.body.appendChild(notification);
// Supprimer la notification après l'animation
setTimeout(() => {
notification.remove();
}, 3000);
} catch (err) {
console.error('Erreur lors de la copie :', err);
alert('Erreur lors de la copie');
}
}
</script>
<?php endif; ?>
<?php
$content = ob_get_clean();
require 'layout.php';