Contourner la limite de taille des fichiers imposée par certains hébergeurs

Contenu du snippet

Vous remarquerez sans doute que de nos jours bon nombre d'hébergeur (grauits surtout) interdisent les gros fichiers: maximum 500ko (awardspace.com), 300ko (gig4free.com) etc... Vous remarquerez également que c'est extrêment ennuyeux de les couper, parce qu'en plus votre visiteur doit avoir le ou les programmes adaptés pour les reconstituer et c'est souvent très lourd. Je vous propose donc une solution simple, très simple même. Jetez donc un coup d'oeil au code puis aux explications finales pour mettre ce code en oeuvre correctement.
Pour le code il y a deux parties correspondant à deux fichiers distincts. Le premier est le code d'une page à uploader sur le serveur de votre hébergeur gratuit. Elle vous permettra de découper vos fichiers à uploader et créer un fichier php contenant le code du réassembleur de fichier. C'est donc la solution facile puisque tout se fait automatiquement. Cependant faites attention, il est fort recommandé de supprimer ce fichier de votre serveur sinon n'importe qui peut y uploader n'importe quoi, ou alors ajoutez au code un systême de protection.
La seconde partie est uniquement le code du réassembleur de fichier. Il vous faut juste paramêtrer la variable $file qui contient le nom de base de votre fichier. Le code va alors réassembler le fichier, en mettant à la suite "$file.000", puis "$file.001", etc jusqu'à ce que "$file.xxx" n'existe pas. Vous devez également découper vos fichiers vous même, vous pouvez utiliser un joli programme (HJsplit pour les windoziens ou bien KJsplit ou gnusplit pour le unixiens, les purs), ou bien utiliser la commande split pour les beaux et braves unixiens (cf post plus bas ou tapez split --help dans un terminal pour avoir de l'aide sur cette commande).
Bon je crois avoir dit ce qu'il y avait à dire... mais surtout n'oubliez pas d'aller sur mon site et de cliquer sur les pubs: http://phpmagic.awardspace.com/ (surtout si vous avez aimé le code)

Source / Exemple :


# Le premier fichier (la partie automatisée) #
<?php
echo '<?xml version="1.0" encoding="utf-8"?>';
?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css">
body{font-family:'Sans', 'Helvetica', 'Verdana','Hoefler Text', 'Times New Roman','Times New Roman', Times, serif; font-size:14px;}
table{font-family:'Sans', 'Helvetica', 'Verdana','Hoefler Text', 'Times New Roman','Times New Roman', Times, serif; font-size:14px;}
a:link{font-size:14px; Text-Decoration:none; color : #000000;font-family:'Sans', 'Helvetica', 'Verdana','Hoefler Text', 'Times New Roman','Times New Roman', Times, serif;background-color:transparent;}
a:active{font-size:14px; Text-Decoration:none; color : #000000;font-family:'Sans', 'Helvetica', 'Verdana','Hoefler Text', 'Times New Roman','Times New Roman', Times, serif;}
a:visited{font-size:14px; Text-Decoration:none; color : #000000;font-family:'Sans', 'Helvetica', 'Verdana','Hoefler Text', 'Times New Roman','Times New Roman', Times, serif;}
a:hover{color : #000000;font-size:14px; Text-Decoration:underline; font-family:'Sans', 'Helvetica', 'Verdana','Hoefler Text', 'Times New Roman','Times New Roman', Times, serif;}
input{color:#333333;border-width:1px;border-color:#666666;border-style:solid;margin:auto;}
</style>
<title>Réconciliez vous avec votre hébergeur gratuit</title>
</head>
<body>
<p style="font-size: 12px; font-family: Verdana, arial;"><b><big>É</big>vitez la restricion de taille des fichiers imposée par votre hébergeur</b><br /><br /></p>
<hr />
<form enctype="multipart/form-data" action="upload.php" method="post"><p>Cutsize (taille maximale des fichiers en ko): <input name="cutsize" type="text" value="500" /><br />Utiliser un fichier sur votre machine: <input type="file" name="userfile" /><br /><input type="checkbox" name="createfolder" value="1" /> Placer les parties du fichier dans un dossier ayant le nom du fichier<br /><input type="checkbox" name="createphpfile" value="1" /> Créer un fichier contenant le code du réassembleur de fichier (il sera nommé "index.php" si les parties sont dans un dossier ou sera nommé nom_du_fichier.extension.php dans le cas contraire)<br /><input type="submit" value="Envoyer le fichier" /></p></form>
<hr />
<p>
<?php

if (isset($_POST["cutsize"]))
    $cutsize = $_POST["cutsize"] * 1024;
else
    $cutsize = 1024*800;

if (isset($_FILES['userfile']['name']))
{
    $file = basename($_FILES['userfile']['name']);
    echo "Détails de l'upload du fichier ".$file.":<br />\n";
    $path = "";
    if (isset($_POST["createfolder"]) && $_POST["createfolder"]=="1")
    {
        $path = $file."/";
        if (!is_dir($file))
        {
            mkdir ($file, 0755) or die ("Erreur fatale: impossible de cé le fichier ".$file);
            echo "Dossier ".$file." crée avec succès...\n";
        }
        else
            echo "Le dossier ".$file." existe déjà...<br />\n";
    }
    $handle = fopen($_FILES['userfile']['tmp_name'], "rb")
        or die ("Impossible de lire le fichier uploadé!");
    $i = 0;
    while (!feof($handle))
    {
        $istring = str_pad($i, 3, '0', STR_PAD_LEFT);
        $partstring = "";
        while(strlen($partstring)<$cutsize && !feof($handle))
            $partstring .= fgets($handle, $cutsize-strlen($partstring)+1);
        $partfile = fopen($path.$file.".".$istring, "wb") or die("Erreur fatale: impossible d'ouvrir ".$file.".".$istring);
        fwrite($partfile, $partstring) or die("Erreur fatale: impossible d'écrire dans ".$file.".".$istring);
        fclose($partfile);
        echo "Fichier $i ecrit<br />\n";
        $i++;
    }
    fclose($handle);
    echo "Le fichier ".$file." a été découpé en ".$i." parties.<br />\n";
    $code = '<?php
$file = "'.$file.'";
if (!file_exists($file.".000"))
    die("Partie 000 de $file non trouvée");
if (strstr($HTTP_USER_AGENT,"MSIE"))
    $attachment = "";
else
    $attachment = " attachment;";
header("Content-type: application/octet-stream");
header("Content-Disposition:$attachment filename=$file");
header("Content-Description: File Transfer");

$istring = "000";
$i = 0;
while(file_exists($file.".".$istring))
{
    readfile($file.".".$istring);
    $i++;
    $istring = str_pad($i, 3, "0", STR_PAD_LEFT);
}
?>';
    if (isset($_POST["createphpfile"]) && $_POST["createphpfile"]=="1")
    {
        if (isset($_POST["createfolder"]) && $_POST["createfolder"]=="1")
        {
            $phpfile = fopen($path."index.php", "w") or die("Erreur fatale: impossible d'ouvrir ".$phpfile);
        }
        else
        {
            $phpfile = fopen($file.".php", "w") or die("Erreur fatale: impossible d'ouvrir ".$phpfile.".php");
        }
        fwrite($phpfile, $code) or die("Erreur fatale: impossible d'écrire dans ".$phpfile);
        fclose($phpfile);
        echo "Code php écrit avec succès<br />\n";
    }
    echo "</p><hr />";
}
else
    echo "</p>";
?>
<p>
</p>
<p style="font-size: 12px; font-family: Verdana, arial;"><a href="http://validator.w3.org/check?uri=referer"><img style="border:0px;width:88px;height:31px" src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0 Strict" /></a>
<a href="http://jigsaw.w3.org/css-validator/check/referer"><img style="border:0px;width:88px;height:31px" src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!" /></a></p>
</body>
</html>

# Fin du premier fichier #

# Le second fichier (code qui réassemble vos parties) #

<?php
/* La partie du code la plus importante: celle qui réassemble le fichier $file des
parties "$file.000", "$file.001", etc... Et les donne en téléchargement à l'utilisateur.

  • /
// Votre fichier $file = "file.rar"; // S'il n'y a pas la première partie ça ne sert à rien if (!file_exists($file.".000")) die("Partie 000 de $file non trouvée"); // Microsoft internet explorer qui fait chier parce qu'il ne respecte pas les // normes oblige à rajouter du code if (strstr($HTTP_USER_AGENT,"MSIE")) $attachment = ""; else $attachment = " attachment;"; // Vous pouvez changer le type de fichier si vous le voulez header("Content-type: application/octet-stream"); header("Content-Disposition:$attachment filename=$file"); header("Content-Description: File Transfer"); // La boucle qui assemble les fichiers $istring = "000"; $i = 0; while(file_exists($file.".".$istring)) { // Que c'est beau readfile()... les parties ne sont pas ouvertes donc ça ne // devrait pas trop prendre de temps même pour les gros fichiers readfile($file.".".$istring); $i++; $istring = $i; while (strlen($istring) < 3) $istring = "0".$istring; } // C'est fini... A vous de jouer --> http://phpmagic.awardspace.com/ ?> # Fin du second fichier #

Conclusion :


Si vous avez aimé allez sur mon site et cliquez sur le pubs: http://phpmagic.awardspace.com/
Un dernier conseil quelque peut astucieux: pour votre fichier file.truc, vous pouvez creer un dossier s'appelant file.truc et contenant les différentes parties. Vous y mettrez aussi la seconde partie du code (celle qui réassemble) avec la bonne valeur de $file et nommerez le fichier "index.php". Ainsi quand le visiteur ira sur votresite.com/file.truc le téléchargement se lancera tout de suite... comme si c'était un vrai fichier! Vous pouvez également utiliser le code du premier fichier et cocher les checkboxes, et ce sera fait tout seul.
Bon j'attend les commentaires avec impatiente, ce seraient cool que des gens essaient ce code et disent sur quel serveur il fonctionne (normalement il devrait fonctionner pour tout les hébergeurs ayant php, mais on sait jamais...)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.