CSV-export in laravel 5 controller
So, ich habe eine kleine ajax-request, um meine reviewsController@export
.
Wenn ich jetzt console.log()
die Daten in mein Erfolgs-Methode, die ajax-Antwort zeigt die richtigen Daten. Aber meine CSV hat nicht heruntergeladen. Also ich habe alle die richtige info und erstellt die csv im wesentlichen.
Ich denke, das hat möglicherweise zu tun mit dem setzen der Header vielleicht?
public function export()
{
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
$reviews = Reviews::getReviewExport($this->hw->healthwatchID)->get();
$columns = array('ReviewID', 'Provider', 'Title', 'Review', 'Location', 'Created', 'Anonymous', 'Escalate', 'Rating', 'Name');
$file = fopen('php://output', 'w');
fputcsv($file, $columns);
foreach($reviews as $review) {
fputcsv($file, array($review->reviewID,$review->provider,$review->title,$review->review,$review->location,$review->review_created,$review->anon,$review->escalate,$review->rating,$review->name));
}
exit();
}
Gibt es irgendetwas, was mache ich hier falsch, oder hat Laravel haben etwas zu bieten für diese?
AFAIK ist dies nicht funktioniert, weil Sie den Aufruf dieser Funktion mit Ajax und ajax kann nicht unterstützen Kopfzeilen herunterladen. Gibt es irgendwelche spezifischen Anforderungen für den Einsatz von ajax? Ich denke, Sie können direkt rufen Sie dieses Skript und die entsprechenden Header, so sollte es auf der gleichen Seite und CSV erhalten generieren.
Ich bevorzuge nur mit ajax, da es nicht um die Seite neu zu laden. Sieht besser aus
Ich bevorzuge nur mit ajax, da es nicht um die Seite neu zu laden. Sieht besser aus
InformationsquelleAutor Matthew Smart | 2015-09-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, diese version heraus - dies sollte Ihnen ermöglichen, hat man eine nette Ausgabe mit
Response::stream()
.(Angepasst von diesem SO beantworten: Verwenden Laravel zu Download-Tabelle als CSV)
Versuchen mit einem normalen link mit
target="_blank"
anstatt mit JavaScript/AJAX. Denn es ist ein Datei-download öffnen in einem neuen tab, die user experience sollte nicht zu klobig.Fehlende Semikolon nach der Schließung definition (direkt vor der
return
)! Sorry. :Sok es keinen Fehler jetzt, aber es macht einfach das gleiche, was meine code haben. Gibt das richtige format und die logs in der Konsole. aber nicht zwingen, eine download
Hey, @Nerdwood. Ich habe gerade bearbeitete Ihre Antwort auf fügen Sie die fehlenden Datei-handler beim Aufruf
fclose
. Ich habe versucht, Ihre Lösung mit L5.4 und bekam eine Fehlermeldung durch. Nach dem hinzufügen, dass es funktionierte wie ein Charme. 🙂Neuere Versionen von Laravel entfernt die
Response::stream()
Funktion. Verwenden Sie stattdessenresponse()->stream($callback, 200, $headers);
InformationsquelleAutor Nerdwood
Dies kann nicht die Antwort auf Ihre Frage nicht direkt, aber ich bin mit einem Paket namens 'thephpleague/csv' für diesen Zweck...
Verwenden Sie dieses Paket:
Setzen Sie die folgenden 'use' Aussagen in Ihrem controller:
und alle Modell-Klassen, die Sie verwenden möchten.
Abstrakte CSV-erstellen von code, um eine Funktion (in dem controller), e.g:
In Ihrem controller, erstellen get-Funktion zum abrufen/download CSV-Datei (ersetzen Sie 'MainMeta' mit Ihrer eigenen model-Klasse):
Wenn Sie eine route erstellen, um diese Funktion aufrufen, wird der download einer CSV-Datei in Ihrem browser, von Ihrem gewählten Modell-Sammlung/Daten.
Erstellen Sie eine route an App\Http\routes.php wie die folgenden:
(Optional) In einem blade-view-Datei (z.B. data.blade.php), einen link oder eine Schaltfläche, so können Sie leicht Zugriff auf die download-url/route:
Wenn Sie auf den link klicken, wird die CSV-Datei heruntergeladen und in Ihrem browser. In einer Anwendung, die ich programmiert haben, werden Sie auf der Seite bleiben Sie auf diesen link klicken.
Natürlich, dies wird unterscheiden sich je nach Ihrer eigenen Anwendung. Es gibt so viel mehr Sie tun können, mit diesem Paket (die vollständige Dokumentation ist auf http://csv.thephpleague.com/). Das Projekt, das ich bin mit diesem im ist an https://github.com/rattfieldnz/bitcoin-faucet-rotator - ich habe gerade mit der Codierung wieder drauf nach ein paar Monaten Weg, also noch ein bisschen refactoring - /Prüf - /Aufräumen zu tun :).
InformationsquelleAutor Rob
Versuchen Sie dies:
fputcsv($FH, $row);
Hallo @HoàngĐăng , es arbeitete in meinem Projekt, vielleicht war eine frühere PHP/Laravel-version, wenn Sie feststellen, das Problem, das Sie beheben könnte, die Antwort danke
InformationsquelleAutor Luca C.