Multi download

clems31
Invité n'ayant pas de compte PHPfrance

11 août 2011, 11:51

Bonjour,

J'explique mon problème :
Sur une premiere page, je selectionne un produit puis plusieurs langues que je veux voir apparaitre dans un fichier .text par langue
Dans une base de données, je recupere la liste de texte classé par langue puis je fais telecharger un fichier de cette facon :
		header('Content-Description: File Transfer');
		header('Content-Type: application/octet-stream');
		header('Content-Disposition: attachment; filename="'.$data2['nom_langue'].'.text";');
Le problème est que peu importe si je met une condition pour que le DL se lance à chaque fois que le code rencontre un nouveau 'nom_langue', il telecharge toujours un unique fichier, avec, à l'interieur tous les textes des langues préalablement choisi...
Mon but est de télécharger dans chaque fichier les textes du produit dans une seule langue, et, idéalement de faire un .zip qui regroupe les multiples fichiers .text...

Merci d'avance de votre collaboration.

ViPHP
ViPHP | 2577 Messages

11 août 2011, 14:52

Bonjour,

Pour ce qui est de faire un zip : http://www.php.net/manual/fr/zip.examples.php

Petit nouveau ! | 8 Messages

11 août 2011, 15:15

Merci mais j'avoue que ce n'est pas particulierement la partie qui m'interesse le plus :(

ViPHP
ViPHP | 2577 Messages

11 août 2011, 15:20

Merci mais j'avoue que ce n'est pas particulierement la partie qui m'interesse le plus :(
Je partage ton avis

Petit nouveau ! | 8 Messages

11 août 2011, 16:16

Je vais rajouter des infos..

J'ai fais une boucle while, tant que une variable lambda < sizeof($id_langue) (qui est un array avec les id des langues sélectionnées)
Dans cette même boucle, je fais ma création de fichier (et son implémentation)
je ferme ma boucle en implémentant d.

Le fichier que je récupère a pris l'id de la dernière langue uniquement, comme si la création du fichier attendait la toute fin...
Pourtant à l'interieur, je récupere bien les données de chaque langue..

Petit nouveau ! | 8 Messages

16 août 2011, 10:23

Personne n'a d'idée ? :(

Eléphant du PHP | 275 Messages

16 août 2011, 11:24

Soit tu utilise le transfer-enconding chunked pour faire de l'html multipart (mais pas sûr que tous les navigateurs se comportent pareil), soit tu peux faire une page de download intermédiaire, qui affiche les différents liens vers les downloads (fonctionnement sans javascript) avec un peu de javascript qui fait un window.open ou un document.location pour chacun de ces liens.

Mammouth du PHP | 568 Messages

16 août 2011, 11:56

Tu devrais t'orienter vers les archives zip.

L'utilisateur sélectionne les langues, clic sur un bouton télécharger et toi tu t'occupe de générer une archive zip que tu envoie au navigateur.

Cela ne te paraitrait-il pas plus propre?

Petit nouveau ! | 8 Messages

16 août 2011, 12:12

Un fichier zip comprenant les différents .text serait parfait, mais je n'arrive pas à trouver comment je peux créer un .zip avec mes fichiers dedans sans les créer un par un (ce qui, justement, pose probleme...)

En attendant une réponse, je vais essayer de me renseigner sur le Chunked transfer encoding.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 août 2011, 14:30

Il en faut peu pour être heureux ......

Petit nouveau ! | 8 Messages

16 août 2011, 18:07

Merci
Cependant, je dois rater quelque chose :
$zip = new ZipArchive;
$d=0;
while ($d<sizeof($id_langue))
{
$filename = "test.zip";
$res = $zip->open($filename, ZipArchive::CREATE);	
 
DATA SQL
 
$zip->addFromString('"'.$id_lange[$d].'".text',"'.$output_text.'");
$d++;
}
header('Content-type: application/zip'); 
header('Content-Disposition: attachment; filename="' . $filename . '"'); 
header("Content-length: " . filesize($filename)); 
 
$zip->close();
Je telecharge une archive test.zip corrompue...
Une idée ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 août 2011, 23:15

- tu ne ferme pas le fichier avant d'essayer de l'envoyer
- tu ne fournit pas le fichier donc je suppose que la taille de ton archive est proche de zéro ?
- compare ceci avec ton code :)

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 8 Messages

17 août 2011, 12:49

Tout d'abord, merci de ton aide
$zip = new ZipArchive;
$filename = "Langues.zip";
$res = $zip->open($filename, ZipArchive::CREATE);
foreach($id_langue as $value)
{
$sql ="SELECT...
 
$file2 = "$value.text";
$zip->addFromString($file2, $output_text);
header('Content-type: application/zip'); 
header("Content-Transfer-Encoding: binary"); 
header("Content-length: ".filesize($filename)); 
header('Content-Disposition: attachment; filename="'.$filename.'"');
}
$zip->close();
readfile($filename);
Le 2eme code me donne le meme resultat...
$file2 = "$value.text";
$zip->addFromString($file2, $output_text);
}
$zip->close();
header('Content-type: application/zip'); 
header("Content-Transfer-Encoding: binary"); 
header("Content-length: ".filesize($filename)); 
header('Content-Disposition: attachment; filename="'.$filename.'"');
readfile($filename);
Mon fichier se télécharge bien dans Téléchargement, donc je ne pense pas devoir définir un emplacement si?
Le problème est que mon .zip garde en mémoire tout ce qu'il a intégré comme fichier...
Si je change le $filename, le resultat est bon.. mais si je refais en changeant les langues, les nouvelles langues s'ajoutent à ma nouvelle archive $filename(1).zip
Un flush(); après le readfile n'y fait rien...


Edit : Un unlink($filename); me résoud ce dernier problème.
Merci pour votre aide !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

17 août 2011, 17:01

A la limite avant la création de l'archive
 <?php
If( file_exists($filename)) unlink($filename) 
?>
comme ça pas de pb, j'ai pas vue comment écraser une archive existante je pensais que le fait d'indiquer la création suffisait :/

Si tu a tout ce que tu veux, peux tu marquer le sujet résolu ? ;) merci

Édit : en fait j'suis mirro, a tu essayé ZIPARCHIVE::OVERWRITE En second paramètre de open ? (pas testé j'ai ce qu' faut sous la main).
@+
Il en faut peu pour être heureux ......