Utilisation Laravel pour Télécharger le tableau au format CSV
Je suis en train d'exporter une table de base de données à l'aide de Laravel
comme un csv
fichier. Je voudrais que l'utilisateur puisse sélectionner le Export as CSV
et bouton de téléchargement de la table, comme une csv
fichier. Actuellement j'ai reçu ce code mais Il ne fonctionne pas:
mon bouton:
<a href="/all-tweets-csv" class="btn btn-primary">Export as CSV</a>
mon itinéraire:
Route::get('/all-tweets-csv', function(){
$table = Tweet::all();
$filename = "tweets.csv";
$handle = fopen($filename, 'w+');
fputcsv($handle, array('tweet text', 'screen name', 'name', 'created at'));
foreach($table as $row) {
fputcsv($handle, array($row['tweet_text'], $row['screen_name'], $row['name'], $row['created_at']));
}
fclose($handle);
$headers = array(
'Content-Type' => 'text/csv',
);
return Response::download($handle, 'tweets.csv', $headers);
});
Il me renvoie cette erreur:
The file "Resource id #154" does not exist
Et j'ai compris que c'est parce qu'il est en train de télécharger un fichier qui n'existe pas. Est t-il un autre moyen que je peux aller sur la modification de mon code afin de télécharger un csv
.
- Pensez à ce qui va se passer, si les deux personnes frappé de cette route à l'exact même temps...
- Je ne sais pas? Je devine que quelque chose de mauvais
- Voir ma réponse sur ce que les questions de votre code.
Vous devez vous connecter pour publier un commentaire.
Presque tout est bien sauf cette ligne:
Vous devez modifier cette ligne en:
Je suis tombé ici en essayant de voir si Laravel avait quelque chose de construit dans, par défaut, les réponses à cette question m'inquiète un peu. Je suis d'accord avec @andré-daniel que la bonne méthode est de ne pas écrire un fichier en premier, mais sa mise en œuvre est manuellement en mettant ensemble les valeurs, ce qui serait un échec si aucune valeur contenue citations, espaces, etc.
C'est une solution plus robuste, à l'aide de Laravel est
Response::stream
et phpfputcsv
pour le format de chaque ligne correctement (va échapper les guillemets, et devis nécessaires à cordes. voir http://php.net/manual/en/function.fputcsv.php pour plus de détails)->toArray()
n'était pas nécessaire dans laravel 5 pour moi - même cassé le foreach pour une raison quelconque - supprimé - tout fonctionne parfaitement bien 😉response()->stream($callback, 200, $headers)
ou utiliser directement l'symfonyStreamedResponse
classe.EDIT: voir cette réponse pour une meilleure solution; je vais garder ma réponse ci-dessous, mais remarque qu'il a des problèmes, comme ne pas échapper à des valeurs et à l'aide des quantités déraisonnables de la mémoire si la génération des fichiers volumineux.
Vous êtes inutilement la création d'un fichier sur le disque; qui induit des e /s disque et entraîner des problèmes si deux personnes demande que l'URL est à l'exact même temps (deux occurrences du cadre permettra d'écrire dans le même fichier et de mauvaises choses vont arriver comme la mise à disposition d'un fichier endommagé ou s'écraser avec une exception).
Utiliser ce lieu :
Considérant le courant plus classé répondre c'est le Laravel 5.7 CSV écrire, note le
return
changements.Tout à l'air bon, sauf cette ligne:
$handle
ne pointe pas vers le bon chemin d'accès au fichier. Il doit être le chemin complet d'accès aux tweets.csv, par exemple:où
$file
doit être quelque chose comme$file = '/path/to/download/tweets.csv'
Voici le code complet à télécharger CSV
J'étais en train de suivre avec ces exemples, et aucun d'entre eux travaillaient pour mon pour mon code. Je joins le code que j'ai écrit pour mon projet comme un exemple. Ce n'est pas de répondre à l'OP, comme un exemple de guide. Mes données sont sous la forme d'un tableau d'objets
Si vous avez remarqué, à mon retour j'ai compris ->send() qui génère le fichier csv et initialise le téléchargement. Où as ->sendContent(); juste décharges de la date à l'écran. Si vous tomber sur ce post avec le même problème que j'ai du fichier, pas de téléchargement, assurez-vous à la caisse de la documentation officielle.
https://api.symfony.com/2.3/Symfony/Component/HttpFoundation/StreamedResponse.html
essayer cette