Browse Source

exporter_csv() : l'option envoyer stream maintenant directement sur output ce qui permet d'envoyer un gros lot de donnees sans timeout ni out of memory

l'option envoyer=attachment permet de retrouver le comportement anterieur, qui passe par un fichier, mais ne presente normalement jamais aucun avantage
v3
Cerdic 2 years ago
parent
commit
16576fe0d6
  1. 40
      inc/exporter_csv.php

40
inc/exporter_csv.php

@ -152,9 +152,27 @@ function inc_exporter_csv_dist($titre, $resource, $options = []) {
// les donnees commencent toujours a la ligne 1, qu'il y ait ou non des entetes
$nb++;
// on passe par un fichier temporaire qui permet de ne pas saturer la memoire
// avec les gros exports
$fichier = sous_repertoire(_DIR_CACHE, 'export') . $filename;
if ($options['envoyer']) {
$disposition = ($options['envoyer'] === 'attachment' ? 'attachment' : 'inline');
header("Content-Type: text/comma-separated-values; charset=$charset");
header("Content-Disposition: $disposition; filename=$filename");
// Vider tous les tampons
$level = @ob_get_level();
while ($level--) {
@ob_end_flush();
}
}
// si envoyer=='attachment' on passe par un fichier temporaire
// sinon on ecrit directement sur stdout
if ($options['envoyer'] and $options['envoyer'] !== 'attachment') {
$fichier = "php://output";
}
else {
$fichier = sous_repertoire(_DIR_CACHE, 'export') . $filename;
}
$fp = fopen($fichier, 'w');
$length = fwrite($fp, $output);
@ -166,19 +184,11 @@ function inc_exporter_csv_dist($titre, $resource, $options = []) {
fclose($fp);
if ($options['envoyer']) {
header("Content-Type: text/comma-separated-values; charset=$charset");
header("Content-Disposition: attachment; filename=$filename");
//non supporte
//header("Content-Type: text/plain; charset=$charset");
header("Content-Length: $length");
// Vider tous les tampons
$level = @ob_get_level();
while ($level--) {
@ob_end_flush();
if ($options['envoyer'] === 'attachment') {
header("Content-Length: $length");
readfile($fichier);
}
readfile($fichier);
// si on a envoye inline, c'est deja tout bon
exit;
}

Loading…
Cancel
Save