8795 sujets

Développement web côté serveur, CMS

Bonjour,
Je fait un site en php5 ou l'on permet au utilisateurs de télécharger un zip stocké dans une base MySQL sous forme blob ,le probléme est que quand on click pour downloader, le fichier zip telechargé contient une ligne vide au début, ce qui rend le fichier illisible pour la décompression .Voici le bout de code concernant cette partie:

download.php
if(isset($_GET['id'])) {
$id = intval($_GET['id']);

include("connexion.php");
$req = "SELECT id, titre, img_url ".
"FROM bdd WHERE id = ".$id;

$ret = mysql_query($req) or die(mysql_error());

$col = mysql_fetch_row($ret);


if(!$col[0]){
echo "Id inconnu";
}
else {

header("Content-Disposition: attachment; filename=$col[1].zip");
header("Content-type: application/zip");
header('Content-Transfer-Encoding: binary');
header("Content-length: " .filesize($col[2));
header("Cache-control: private");
header("Location:".$col[2]);

readfile($col[2]);

}
}
else {
echo "Mauvais id";
}

voici le lien:
<a href=\"download.php?id=$i\">Download</a>
Modifié par Heyoan (20 Feb 2010 - 16:09)
Hello juli2000 et bienvenue Smiley smile ,

En tant que modérateur, je me dois de te faire remarquer que tu n'as malheureusement pas respecté l'une des Règles de base du forum qui est d'afficher les codes et exemples proprement à l'aide des boutons [ code]... ici ton code HTML, CSS, PHP, etc.[ /code] (sans espace après le crochet ouvrant).

upload/1-code.gif

Je te remercie par avance de bien vouloir éditer ton message afin de le rendre conforme à cette règle. Smiley cligne

D'ailleurs, je te rappelle que l'Aide (dont le lien est fourni lors de l'inscription) contient des pistes de recherche, des indications sur les règles de vie de la communauté, etc.


Pour ce qui est de ton code et avant de chercher plus loin il manque un crochet fermant à la ligne :
header("Content-length: " .filesize($col[2));
Après un test, et en corrigeant le problème de crochet fermant, il suffit de remplacer
readfile($col[2]);
par
echo($col[2]);
Merci pour votre reponse, mais j'ai corriger ce que m'avait corriger, toujour rien il télécharge mais le zip est vide, j'ai déja verifier du coté bdd le fichier existe et il est correct.
pour la regle que je n'ai pas respecter, désoler je vien de me rendre compte, je suis tres stressée, je cherche depuis presque 2mois sur ce point mais je bloque.meci d'avoir repondu
juli2000 a écrit :
pour la regle que je n'ai pas respecter, désoler je vien de me rendre compte
Merci d'éditer ton message et de rajouter les balises manquantes. Smiley smile

Je reviens avec un exemple de code...
Bon je me suis occupé de la mise en forme puisque tu n'avais pas bien compris comment ça marche. Smiley murf

Alors un exemple :

table fichiers_joints
CREATE TABLE `fichiers_joints` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` text collate utf8_unicode_ci NOT NULL,
  `type` text collate utf8_unicode_ci NOT NULL,
  `size` int(10) unsigned NOT NULL,
  `content` longblob NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

index.php
<!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" xml:lang="fr" lang="fr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Test blob</title>
</head>
<body>
<?php
$id = 0;
$erreur = false;
if (!empty($_GET['upload'])) { // fichier uploadé
	if (!empty($_FILES['fichier'])) {
		if (empty($_FILES['fichier']['name'])) {
			$erreur = 'Sélectionner un fichier !';
		} else if($_FILES['fichier']['error']!=0) {
			$erreur = 'Une erreur '.$_FILES['fichier']['error'].' est survenue durant l\'upload !';
		} else { // Upload OK
			foreach($_FILES['fichier'] as $key=>$value){
				$$key = $value;
			}
			require_once('connexion.inc.php');
			$sql = sprintf("Insert into fichiers_joints (id, name, type, size, content) VALUES ('', '%s', '%s', %d, '%s')",
				mysql_real_escape_string($name),
				mysql_real_escape_string($type),
				$size,
				mysql_real_escape_string(file_get_contents($_FILES['fichier']['tmp_name'])));
			mysql_query($sql) or die (mysql_error());
			$id = mysql_insert_id();

		}
	} else {
		$erreur = 'Taille Maxi : 2Mo !';
	}
}
if(empty($id)) {
	if($erreur) echo '<p>'.$erreur.'</p>';
?>
<form enctype="multipart/form-data" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>?upload=1" method="post">
	<p>
		<label for="fichier">Fichier : </label>
		<input type="file" name="fichier" id="fichier"/>
	</p>
	<p>
		<input type="submit" />
	</p>
</form>
<?php } else { ?>
<a href="transfert.php?id=<?php echo $id; ?>">Récupérer le fichier uploadé</a>
<?php } ?>
</body>
</html>

transfert.php
$id = !empty($_GET['id']) ? intval($_GET['id']) : 0;
if(!empty($id)) {
	require_once('connexion.inc.php');
	$req = "SELECT name, type, size, content FROM fichiers_joints WHERE id =".$id;
	$ret = mysql_query($req) or die(mysql_error());
	$col = mysql_fetch_row($ret);
	if(!$col[0]){
		echo "Id inconnu";
	} else {
		header("Expires: Mon, 26 Jul 1997 05:00:00 GMT\n");
		header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
		header("Content-Disposition: attachment; filename=\"$col[0]\"");
		header("Content-type: $col[1]");
		header("Content-Transfer-Encoding: binary");
		header("Content-length: $col[2]");
		header("Cache-control: private");
		echo ($col[3]);
	}
} else {
	echo "Mauvais id";
}

Modifié par Heyoan (20 Feb 2010 - 18:01)
Merci beaucoup
j'ai repris votre code, lors du download il indique:
Le seveur a renvoyé une réponse incorrect sur une commande de redémarrage.
j'utilise le wamp comme serveur local.