OVH Community, votre nouvel espace communautaire.

PHP Download gros fichiers


Shinedownz
22/02/2016, 19h04
Bonsoir,

J'ai un site sur lequel mes modèles (je suis photographe amateur) peuvent télécharger leurs photos après un shooting. Étant fan de programmation depuis que je suis petit, je fais ce site entièrement moi même.

Depuis un mois j'essaye de créer un système qui permettra de télécharger l'album photo en une fois dans une archive *.RAR. La taille de ces archives est aléatoire mais presque jamais sous 100Mo (photos HD). J'utilise donc un code PHP qui envoie le fichier morceau/morceau. Le problème est que ça marche bien pour des petits fichiers mais pour les archives, elles sont toujours incomplètes.
J'ai déjà essayé plusieurs méthodes trouvées sur le net mais rien ne corrige ce problème. Je possède un hébergement mutualisé chez OVH, est-ce possible que cela vienne du serveur?

Mon code actuel :

Code PHP:
ignore_user_abort(true);
set_time_limit(0);

// ... du code pour récupérer le nom du fichier

if (file_exists($fullPath)) {
    if (
$fd fopen ($fullPath"rb")) {
        
$fsize filesize($fullPath);
        
$path_parts pathinfo($fullPath);
        
$ext strtolower($path_parts["extension"]);
        switch (
$ext) {
            case 
"jpg":
            
header("Content-type: image/jpeg");
            
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
            break;
            default;
            
header("Content-type: application/octet-stream");
            
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
            break;
                
            case 
"rar";
            
header("Content-type: application/x-rar-compressed");
            
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
            break;
            default;
            
header("Content-type: application/octet-stream");
            
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
            break;
        }
        
header("Content-length: $fsize");
        
header("Cache-control: private");
            
        
ob_end_flush();
        
ob_end_clean(); //deux lignes vue sur internet
        
while(!feof($fd)) {
            
$buffer fread($fd2048));
            echo 
$buffer;
            
flush();
        }
    }
    
fclose ($fd);
    exit;

Merci pour vos futurs réponses.

Bonne soirée !
Laurent M.