Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/11/2010, 18h29   #1
Invité de passage
 
Inscription : janvier 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 14
Points : 1
Points : 1
Par défaut Téléchargement

Salut à tous !

J'ai fais un script permettant de récupérer des fichiers grace à la methode GET sous cette forme :
Citation:
download.php?action=dl&requete_file=fr_winxp_pro_with_sp2.iso
Le script (php) ci-dessous marche très bien pour des images, fichiers doc etc... mais quand au fichier "lourd" (540 MB)J'ai, sous internet explorer une erreur 500 et sous chrome :
Citation:
Erreur 6 (net::ERR_FILE_NOT_FOUND) : Fichier ou répertoire introuvable
or, mon fichier est bien présent avec les droits 777
Voici mon script php :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php session_start();
require_once("config/main.inc.php"); //Parametre generale du site.
require_once("config/db.inc.php"); // Parametre de connexion Base de donnée.
 
if(empty($_GET["action"])){header("Location:index.php");}
elseif(empty($_GET["requete_file"])){header("Location:index.php");}
 
if($_GET["action"] == "dl"){
$fichier = $_GET["requete_file"];
$chemin = PATH_PARTICULIER.'/'.$fichier;
	if (file_exists($chemin))
	{
   		 header('Content-disposition: attachment; filename="' . $fichier . '"');
   		 header('Content-Type: application/force-download');
   		 header('Content-Transfer-Encoding: binary');
    		header('Content-Length: '. filesize($chemin));
    		header('Pragma: no-cache');
   		 header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    			header('Expires: 0');
    		readfile($chemin);
		mysql_query('UPDATE  `stats_users` SET  `STATUT` = "DOWNLOAD" WHERE  `stats_users`.`ID_USER` ="'.$_SESSION["ID"].'" AND FICHIER = "'.$fichier.'" LIMIT 1 ;')or die(mysql_error());
 
 
	}
}
if($_GET["action"] == "del"){
 
$fichier = $_GET["requete_file"];
$chemin = PATH_PARTICULIER.'/'.$fichier;
 
				mysql_query("UPDATE  `BDD`.`stats_users` SET  `SUPPRIMER` =  'oui' WHERE  `stats_users`.`ID_USER` ='".$_SESSION["ID"]."' AND `FICHIER`='".$fichier."'")or die(mysql_error());
				unlink($chemin);
header("Location:index.php");
 
}
 
?>
Une idée ?

Merci d'avance.
Sacha
sachbak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 20h55   #2
Membre du Club
 
Avatar de vrd-74
 
Inscription : novembre 2010
Messages : 40
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 40
Points : 49
Points : 49
Salut

La fonction readfile est destinée à afficher un fichier, à mon avis tu dois être limité par la taille de ton buffer de sortie.
J'aurai plutôt fait la chose ainsi personnellement :

Code :
1
2
3
4
if (file_exists($chemin)) {
    	echo '<a href="$chemin" title="Download" id="linkDownload">Download</a>';
	mysql_query('UPDATE  `stats_users` SET  `STATUT` = "DOWNLOAD" WHERE  `stats_users`.`ID_USER` ="'.$_SESSION["ID"].'" AND FICHIER = "'.$fichier.'" LIMIT 1 ;')or die(mysql_error());
}
Plus simple et moins intrusif pour l'utilisateur (mais c'est un avis personnel). Tu peux déclencer le clic sur lien par javascript au bout de quelques secondes avec un timeout de cette façon :
Code :
1
2
3
setTimeout(function() {
	document.getElementById('linkDownload').fireEvent('onclick');
}, 3000); // lancement du téléchargement au bout de 3sec
Le lien pourrai être "Votre téléchargement va se lancer automatiquement, si non cliquez ici", quelque chose dans ce style.

Deux petits conseils pour terminer :
- N'oublie pas d'utiliser urlencode et urldecode sur les noms des fichiers quand tu les passent en GET
- N'oublie pas non plus de sécuriser la suppression du fichier (ici aucun contrôle n'est fait, mais peut être que tu comptes voir ça plus tard). Dans le même ordre d'idée, aucun contrôle n'est effectué sur les variables de sessions avant la requête.

Autrement pour le message d'erreur je ne suis pas certain que cela soit lié au buffer de sortie, à voir.
vrd-74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 21h09   #3
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2006
Messages : 951
Points : 1 063
Points : 1 063
Citation:
Envoyé par sachbak Voir le message
Citation:
download.php?action=dl&requete_file=fr_winxp_pro_with_sp2.iso
attention la législation sur la contrefaçon de logiciel est extrêmement sévère, prend garde à ne diffuser tes binaires qu'à des personnes qui peuvent légitimement y avoir accès, en fonction du droit de ton pays.

Messieurs les modérateurs, épargnez moi !
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 22h06   #4
Invité de passage
 
Inscription : janvier 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 14
Points : 1
Points : 1
Merci pour vos réponses.

vrd-74, le fait de mettre en place ce système d'attente d'environs 3 secondes corrige le problème ? c'est pour laisser charger le fichier ?
Je n'est pas vraiment compris pourquoi tu veux faire ça
J'avais envoyer des fichiers avant de 700 MB est pourtant il n'y avais aucun problèmes (avec le même script )entre temps j'avais modifié pas mal de truc sur mon php.ini (que j'ai cassé) , donc j'ai préférais remettre le php.ini par défaut.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 90000M
 
; Maximum number of files that can be uploaded via a single request
max_file_uploads = 10000
; Maximum size of POST data that PHP will accept.
; http://php.net/post-max-size
post_max_size = 1000000M
; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 30
 
; Maximum amount of time each script may spend parsing request data. It's a good
; idea to limit this time on productions servers in order to eliminate unexpectedly
; long running scripts.
; Note: This directive is hardcoded to -1 for the CLI SAPI
; Default Value: -1 (Unlimited)
; Development Value: 60 (60 seconds)
; Production Value: 60 (60 seconds)
; http://php.net/max-input-time
max_input_time = -1
 
; Maximum input variable nesting level
; http://php.net/max-input-nesting-level
;max_input_nesting_level = 64
 
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 128M
peut être ça le problème ?



gene69, étant étudiant, notre école a un contrat MSDNA avec Microsoft pour que leurs étudiants puisse bénéficier de certains OS gratuitement.Bien entendu,le petit script que je développe est personnel sur un site totalement priver

Merci d'avance
Sacha
sachbak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 22h11   #5
Membre du Club
 
Avatar de vrd-74
 
Inscription : novembre 2010
Messages : 40
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 40
Points : 49
Points : 49
La méthode du lien permet d'éviter l'appel à la fonction readfile (qui tente de lire le fichier et donc de le bufferiser (ça se dit ?)).

Je pense que cette valeur peut brider ton readfile :
Mais je n'avance aucune certitude, je ne connais pas exactement le fonctionnement interne de cette fonction.
vrd-74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h02.


 
 
 
 
Partenaires

Hébergement Web