php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2009

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 21.12.2009, 18:10  
Neuer Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 3
PHP-Kenntnisse:
Anfänger
ms176 befindet sich auf einem aufstrebenden Ast
Standard Header eines Filehandles vorgeben?

Hallo,
ich will eigentlich nur eine Datei zum Download erzeugen die mit Daten gefüllt ist.
Das ganze soll dem User als Dialog zum Speichern/Öffnen angeboten werden.
Nach kurzer Googlesuche hab ich folgendes zusammen bekommen. Wenn ich das laufen lassen, bekomme ich jedoch immmer nur die aktuelle Datei zum Download - die ich ja nicht haben will. Ich sitz da jetzt ungelogen seit 2 Stunden dran und finde es einfach nicht. Ich habe versucht den header direkt anzugeben und mit fwrite über das Handle. Auch mit readfile am ende und ohne habe ich es versucht. Die Datei wird angelegt und es steht auch der richtige Text drin. Jedoch wird sie nicht zum Download angeboten. Das ganze ist übrigens in Verbindung mit TYPOlight, falls das widererwartend etwas ändern sollte.

PHP-Code:
                $filename="adressen.txt";
                
$file fopen($filename"w+") or die("Error, konnte Datei nicht öffnen / erstellen.");
                
fwrite($fileheader("Pragma: no-cache"));
                
fwrite($fileheader("Content-Type: text/plain; charset=UTF-8"));
                
fwrite($fileheader("Content-Length: filesize($filename)"));
                
fwrite($fileheader("Content-Disposition: attachment; filename=".$filename));
                
fwrite($file"antragsteller;anspr;str;plz;ort;tel;fax;email\n");

                
// get data from db and create file
                //xxxxxxxxxxxxxx // auskommentiert für Forenzwecke - Abfrage geht aber
                
while ($objAntragsteller->next())
                {
                    
fwrite($file$objAntragsteller->antragsteller ";");
                    
fwrite($file$objAntragsteller->ansprechpartner ";");
                    
fwrite($file$objAntragsteller->adresse ";");
                    
fwrite($file$objAntragsteller->postleitzahl ";");
                    
fwrite($file$objAntragsteller->ort ";");
                    
fwrite($file$objAntragsteller->email ";");
                    
fwrite($file$objAntragsteller->telefon ";");
                    
fwrite($file$objAntragsteller->telefax ";\n");
                }
                
readfile($file);
                
fclose($file); 
Ich hoffe ihr könnt mir helfen.

Grüße
Marc
ms176 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 21.12.2009, 20:32  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.240
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Sorry, das direkt so zu sagen, aber das ist Blödsinn.
Header ist eine HTTP-Funktion bzw. gibt einen HTTP-Header aus. Das hat in Zusammenhang mit Dateiinhalten (die du per fwrite festlegst) nichts aber auch gar nichts verloren. Selbst wenn: header verrät dir im Handbuch, dass die Funktion void ist, also exakt nichts zurückgibt. Alleine schon deswegen ist es Blödsinn. Wo du das her hast, keine Ahnung aber falls das aus einem Tutorial oder ähnliches kommt, mache in Zukunft einen großen Bogen darum.

So. Machen wir weiter im Text.
PHP-Code:
header("Content-Length: filesize($filename)"
Das ist syntaktisch völliger Quatsch. Herauskommen wird als Header hier:
Code:
Content-Length: filesize(adressen.txt)
Damit kann der Browser absolut nichts anfangen.

Der Rest sieht so falsch nicht aus. Lediglich, dass du überhaupt eine Datei beschrieben willst um sie hinterher als Download zur Verfügung zu stellen, ist zwar nicht falsch, aber vollkommen überflüssig. Es genügt, nach den Header-Aufrufen einfach per Echo den Inhalt der zu downloadenden Datei auszugeben. Wahlweise schreibe es vorher in einen Puffer um den richtigen Wert für Content-Length herauszufinden:
PHP-Code:
ob_start();
echo 
'Meine Dateiinhalte';
.....
$inhalt ob_get_contents();
header('Content-Length: '.strlen($inhalt));
ob_end_flush(); 
So, deine eigentliche Frage bzw. dein Problem (Wenn ich das laufen lassen, bekomme ich jedoch immmer nur die aktuelle Datei zum Download) habe ich nicht ansatzweise verstanden. Für mich klingt das danach, dass der Inhalt deines Downloads falsch ist. Das macht mit deinem Script jedoch keinen Sinn, sofern du alle Probleme mit Browser-Caches mal ausschließt.
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist offline  
Alt 22.12.2009, 09:42  
Neuer Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 3
PHP-Kenntnisse:
Anfänger
ms176 befindet sich auf einem aufstrebenden Ast
Standard

Erstmal danke für die Antwort.
Mit aktueller Datei meinte ich die Datei von der ich das ganze aufrufe.
Aber die Stichworte - header nur für http hat mir das ganze erklärt und ja - ich werde einen großen Bogen um das Tutorial das sich schlicht weg - "Kumpel: 'Ja, das ist total einfach- mach das so'".

Inzwischen sieht das ganze so aus und funktioniert leider nur teilweise.

PHP-Code:

$filename
="adressen.txt";
                
header("Pragma: no-cache");
                
header("Content-Type: text/plain; charset=UTF-8");
                
header("Content-Length: ".filesize($filename));
                
header("Content-Disposition: attachment; filename=\"$filename\"");
                echo 
"antragsteller;anspr;str;plz;ort;tel;fax;email\n";

                
// get data from db and create file
                // DB-Abfrage mit mehr als einem Ergebnis

                
while ($objAntragsteller->next())
                {

                    echo 
$objAntragsteller->antragsteller ";";
                    echo 
$objAntragsteller->ansprechpartner ";";
                    echo 
$objAntragsteller->adresse ";";
                    echo 
$objAntragsteller->postleitzahl ";";
                    echo 
$objAntragsteller->ort ";";
                    echo 
$objAntragsteller->email ";";
                    echo 
$objAntragsteller->telefon ";";
                    echo 
$objAntragsteller->telefax ";\n";

                }
                
readfile($filename); 
Komischerweise schreibt er mir nur den ersten Datensatz in das File. Ich hab mir meine Query ausgeben lassen und durch SQL gejagt - da kommt mehr als ein Ergebnis raus. Daher schätze ich, dass es irgendwo am PHP liegt. Jemand eine Idee?

Grüße und Danke
ms176 ist offline  
Alt 22.12.2009, 09:47  
Neuer Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 3
PHP-Kenntnisse:
Anfänger
ms176 befindet sich auf einem aufstrebenden Ast
Standard

Habs gefunden. Der Filesize war natürlich nicht korrekt. ...
Danke
sobald ich es sauber zusammen hab. Werd ich es der Vollständigkeit nochmal posten.

Hier die Lösung
PHP-Code:
// create file which should be downloaded
                
$filename="adressen.txt";
                
                
$inhalt .= "antragsteller;anspr;str;plz;ort;tel;fax;email\n";

                
// get data from db and create file
                // Datenbank Abfrage für Forenzwecke verändert
                
$objAntragsteller $dbErg;

                while (
$objAntragsteller->next())
                {

                    
$inhalt .= $objAntragsteller->antragsteller ";";
                    
$inhalt .= $objAntragsteller->ansprechpartner ";";
                    
$inhalt .= $objAntragsteller->adresse ";";
                    
$inhalt .= $objAntragsteller->postleitzahl ";";
                    
$inhalt .= $objAntragsteller->ort ";";
                    
$inhalt .= $objAntragsteller->email ";";
                    
$inhalt .= $objAntragsteller->telefon ";";
                    
$inhalt .= $objAntragsteller->telefax ";\n";

                }
                
header("Pragma: no-cache");
                
header("Content-Type: text/plain; charset=UTF-8");
                
header("Content-Length: ".strlen($inhalt));
                
header("Content-Disposition: attachment; filename=\"$filename\"");
                echo 
$inhalt;
    
//            readfile($filename); 
Sobald readfile nicht auskommentiert ist funktioniert die Geschichte mit der Länge nicht mehr. Ich bin ehrlich und sag ganz klar - ich weiß nicht warum.

Grüße und Danke
Marc

Geändert von ms176 (22.12.2009 um 10:07 Uhr). Grund: Done
ms176 ist offline  
Alt 22.12.2009, 11:18  
Erfahrener Benutzer
 
Registriert seit: 01.12.2009
Beiträge: 645
PHP-Kenntnisse:
Fortgeschritten
draco88 befindet sich auf einem aufstrebenden Ast
draco88 eine Nachricht über ICQ schicken
Standard

Du brauchst das ganze nicht in einer Datei zu speichern, deshalb ist readfile komplett überflüssig. Es wird einfach eine Datei mit dem Inhalt $inhalt zum Download angeboten.

lg
draco
draco88 ist offline  
Alt 22.12.2009, 11:30  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.637
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Zitat:
Zitat von ms176 Beitrag anzeigen
Sobald readfile nicht auskommentiert ist funktioniert die Geschichte mit der Länge nicht mehr. Ich bin ehrlich und sag ganz klar - ich weiß nicht warum.

Grüße und Danke
Marc
Zitat:
Returns the number of bytes read from the file. If an error occurs, FALSE is returned and unless the function was called as @readfile(), an error message is printed.
Das macht readfile().

Da du die Datei nicht mehr erzeugst, sie also gar nicht auf dem Server existiert sondern immer dynamisch generiert wird, gibt readfile() einen Fehler aus welcher natürlich mit an den Browser geschickt wird -> der Inhalt ist länger als im Header angegeben.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
header Senifor PHP Tipps 2009 3 04.11.2009 17:51
[Erledigt] mod_rewrite, Datei Downloads und falsche Header kip Server, Hosting und Workstations 1 16.09.2009 12:37
[Erledigt] Eigener Webserver - Header auslesen DarkChris PHP-Fortgeschrittene 5 15.09.2009 15:15
[Erledigt] Cannot modify header information - headers already sent by Lachesis PHP Tipps 2009 10 30.04.2009 23:16
Download einer csv-Datei netty PHP-Fortgeschrittene 6 02.05.2008 15:53
https header und Cookie TailerD PHP Tipps 2008 5 26.01.2008 19:54
header() ??? TeazY PHP Tipps 2008 9 11.01.2008 15:40
header() verändert den tatsächlichen header nicht Andreas PHP-Fortgeschrittene 6 12.09.2005 08:04
Problem: Cannot modify header information Alpha Centauri PHP Tipps 2005 11 25.04.2005 13:05
header prob mit auth und smarty PHP Tipps 2005 4 07.03.2005 12:10
[Erledigt] Datei selber nach einer Abfrage senden, header() geht nicht? PHP Tipps 2005 2 23.02.2005 05:58
Redirect mit Header - Problem PHP Tipps 2005 3 22.02.2005 10:28
Warning: Cannot modify header... einbinden nicht möglich? PHP Tipps 2004 2 07.08.2004 15:06
Header Probleme! Calexico PHP Tipps 2004 7 30.06.2004 23:05
header PHP Tipps 2004 4 03.06.2004 22:12

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php fwrite header, fwrite utf-8, php read file header, php header fwrite, mod_rewrite content disposition header setzen, header content-length, fwrite utf-8 header, header content-length sinn zweck, datei download dateiname vorgeben, mail html php fwrite html header, fwrite php header, php fwrite utf8 header, fwrite() header, utf8 file vorgeben, content-length php header, @readfile wird nicht im frame, readfile fwrite, php header mit abfrage speichern öffnen, php file header attachment utf8, html datei download code dateiname vorgeben

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:52 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum