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

5/5 (22 avis)

Snippet vu 17 013 fois - Téléchargée 27 fois

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

Ajouter un commentaire Commentaires
creat1 Messages postés 3 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 18 octobre 2007
18 oct. 2007 à 19:36
Je ne comprends pas comment vous faites.
Le script fonctionne tres bien, tant que le fichier
à une taille inferieur à upload_max_filesize.

Des que le fichier depasse cette taille, le script ne recoit meme
pas l'info venant du formulaire!
isset($_FILES['userfile']['name']) est false!

pourriez vous m'aider?
kurt67 Messages postés 48 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 4 avril 2007
29 déc. 2006 à 11:24
Bon j'ai updaté mon code, mais très franchement, maintenant que j'ai mis mon site à jour j'ai la flemme d'updater la source de phpcs
Donc faites un tour sur le site si vous voulez l'update: http://phpmagic.awardspace.com/
ironzorg Messages postés 45 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 27 juin 2008
18 sept. 2006 à 18:45
Pas mal ... Perso j'aime bien meme si cela ne relève pas de ma compétence de donner mon avis dans ce genre de site ( genre site dédié au PHP :p )

Signé : un inconditionnel du cpp ...
kurt67 Messages postés 48 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 4 avril 2007
27 juin 2006 à 17:30
wow chouettos je ne savais pas qu'il y avait une commande...
et pour répondre à zeratul67, comme je l'ai dit précédemment cette découpe est possible en php, tout simplement en découpant le fichier uploadé quand il est encore dans le fichier temporaire du serveur (la restriction de taille n'est alors pas encore appliquée). Regardez le code que j'ai uploadé sur mon site: http://phpmagic.awardspace.com il découpe le fichier et créer le fichier contenant le code php qui le re-rassemble. Dites moi ce que vous en pensez et j'aimerais bien que des gens l'essayent (en fait je ne suis pas sur à 100% que ça fonctionne sur tout les serveurs, mais si c'est le cas j'updaterais le code de phpcs).
Par contre découper en javascript, à mon avis, ça le fait pas trop :D
Killvador Messages postés 19 Date d'inscription dimanche 12 janvier 2003 Statut Membre Dernière intervention 27 juin 2006
27 juin 2006 à 14:02
Pour les GNU/linuxiens, la commande split ressemble à ceci :

split -b taille -d -a 3 fichier fichier.

ou vous pouvez utilisez les suffixes k et m pour la taille (pour free 1 ou 2 m est une bonne taille).

le premier "fichier" est le nom du fichier à découper et le second est le préfixe (donc ne SURTOUT pas oublier le point à la fin).

Voila, j'aurais envie de dire gg kurt !

Pour démonstration de ce système : http://wildersmovies.free.fr/ -> la Maison de l'erreur
Quoi? de la pub??, mais vous mentez ! c'est pas vrai!

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.