Forum Clubic

[Résolu] [PHP] forcer telechargement d'un gros - fichier.......... gros blocage !

Hello tout le monde.

j’ai un p’tit site familial ou je partage les photos et videos de nos rencontres.
Les photos, je n’ai aucun soucis puisqu’elles s’affichent directement sur la page.
La video je voulais qu’elle ne soit pas en streaming mais directement telechargée (avec une adresse du style http://adresseduserveur/down.php?id=xxx)) par les autres membres de la famille. J’ai utilisé pour cela php dont voici le code du fameux down.php cité plus haut:

<?php
session_start();
session_register('report');
include("user_verif.php");
 user_verif("1", "index2.php");

//// Cette partie sert à verifier si l'utilisateur est authentifié, cela fonctionne.
 
$id = $_GET['id'];

if ($id == '001'){
$file = 'I:\Famille\Video\TEST.avi';
$nom = 'un test.avi';
}
elseif ($id == '002'){
$file = 'I:\Famille\Video\MOV001.AVI;
$nom = '25 Decembre 2005.AVI';

[...] <= tronqué car toujours le meme principe

}
header('Content-Transfer-Encoding: none');
header('Content-Type: application/octetstream; name="'.$nom.'"');
header('Content-Disposition: attachment; filename="'.$nom.'"');
header('Content-length: '.$file);
echo file_get_contents($file)
?>

Cette methode fonctionne à merveille sur des petits fichiers de quelques megas mais j’ai l’impression que php créé une copie du fichier avant de l’envoyer et comme j’ai des videos assez longues car non coupées (cassette de la camera directement recompressée en xvid) ca fait des videos de 4 à 500 megas. Le temps que mon pauvre serveur perso créé la copie du fichier il se passe un temps assez long, souvent le navigateur s’impatiente et paff c’est foutu !

J’aimerais savoir si il est possible que php ne mette pas en cache les fichiers avant de les envoyer comme si je faisais un lien direct sans utiliser php.

Je tiens à preciser que les videos ne sont pas sur le meme disque dur que les pages ouaibe (manque de place, on fait avec ce que l’on a)

Ma version de php est la 4.4.4
Si il y a besoin, j’ai aussi une base de donnée mysql.

Et j’aimerais utiliser php pour que tout le monde n’ait pas acces à ces fichiers (car j’ai un systeme d’authentification à l’ouverture du site)

PS: Ce script, sur des petits fichiers, quand il fonctionne, marche tres bien sous firefox 2.0 beta mais sous internet explorer, hop une belle erreur :confused: mais ce n’est pas ma priorité pour le moment, si il faut je vais tous les passer sous FF et tout sera OK.

Si quelqu’un à une piste à me proposer, je suis bien evidement interessé :wink:

Merci.

Ce n’est pas une histoire de mise en cache. Ton problème vient de la fonction file_get_contents($file) qui va lire tout le contenu de ton fichier … c’est rapide pour des petits fichiers, mais beaucoup trop long pour des grosses vidéos, faut trouver autre chose.

Tu peux indiquer simplement un lien et préciser de faire clic droit enregistrer sous pour te simplifier la vie


<?php
$url="file.avi";
header('Content-Description: File Transfer');
header('Content-Type: application/force-download');
header("Content-Disposition: attachment; filename=\"".basename($url)."\";");
header('Content-Length: ' . filesize($url));
@readfile($url) OR die();
?>

Toute l’astuce est donc dans la fonction readfile() au lieu de file_get_contents() :wink:

je vais essayer ca et j’tiens au courant.
Merci :slight_smile:

Ca fonctionne parfaitement :slight_smile: merci beaucoup :slight_smile:
j’ai meme reussi à resoudre le probleme du pourquoi ca ne fonctionnait pas sous internet explorer :slight_smile:

au final ca donne ceci:

<?php
session_start();
session_register('report');
include("user_verif.php");
 user_verif("2", "index2.php");
 
$id = $_GET['id'];

if ($id == '001'){
$file = 'I:\Famille\Video\Joyeux Noel.avi';
$nom = 'Joyeux Noel.avi';
}
elseif ($id == '002'){
$file = 'I:\Famille\Video\Video1.avi';
$nom = 'video.avi';
}

$tailleFichier = filesize($file);
header('Content-Transfer-Encoding: none');
header('Content-Type: application/octetstream; name="'.$nom.'"');
header('Content-Disposition: attachment; filename="'.$nom.'"');
header('Content-length: '.$tailleFichier);
@readfile($file) OR die();
?>

Avec le bon header sur la taille du fichier puis la variable correctement declarée ca fonctionne :slight_smile:

Merci ^^

De rien :jap:

Metaldark > Pas la peine de citer intégralement son message précédent… seul la partie "Merci ^^" aurait suffit.