php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Datei-Download


 
xlerator
24-01-2007, 16:53 
 
Hallo zusammen.

Ich möchte auf einer Webseite Dateien zum Download anbieten. Da ich die Klicks zählen, aber keinen Umweg über eine andere Seite gehen möchte mache ich das mit header Befehlen, parallel werden die Infos in eine Datenbank geschrieben.

Das sieht so aus:


header("Cache-Control: ");
header("Pragma: ");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".basename($url)."\";");
header("Content-length:".(string)(filesize($url)));


Funktioniert soweit auch im IE und FireFox. Aber der Safari Lädt die index.php runter. Dasselbe passiert in allen Browsern wenn man versucht die Dateien per Rechtsklick runterzuladen. :confused:

Für andere Lösungen wäre ich sehr dankbar.

Gruß xlr

 
Kropff
24-01-2007, 16:57 
 
unter umständen ein
header("Content-type: application/force-download");
klappt das mit rechtsklick im ff tatsächlich? ich sehe dann meistens auch ein bla.php zum downloaden

gruß
peter

 
xlerator
24-01-2007, 17:34 
 
hi, force download habe ich auch schon versucht, dasselbe ergebnis...
in firefox und ie funktioniert es nur mit linksklick...

 
Kropff
24-01-2007, 20:11 
 
Aber der Safari Lädt die index.php runter
ach ja, vergessen, die typischen mac-scheisse. das machte schon der ie auf diesen kisten. allerdings meine ich mich zu erinnern, dass zwar als datei "index.php" angezeigt wurde, aber letztendlich immer die richtige datei dann heruntergeladen wurde.
in firefox und ie funktioniert es nur mit linksklick
da kannst du wohl nichts dagegen machen, außer einen hinweis zu setzen.

gruß
peter

 
wahsaga
24-01-2007, 21:37 
 
Original geschrieben von Kropff
allerdings meine ich mich zu erinnern, dass zwar als datei "index.php" angezeigt wurde, aber letztendlich immer die richtige datei dann heruntergeladen wurde.
Na was soll er denn auch sonst runterladen - den PHP-Code etwa...?

 
xlerator
24-01-2007, 22:39 
 
nö er lädt das geparste php runter sprich das html da steht sogar noch schön "database connection error" drin

ich bin doch net der einzige der downloads tracken will, was gibt es denn noch für möglichkeiten?

 
ghostgambler
24-01-2007, 23:20 
 
Original geschrieben von xlerator
nö er lädt das geparste php runter sprich das html da steht sogar noch schön "database connection error" drin
zeugt mehr von fehlerhaft ausgeführtem PHP-Code, Debug-Ausgaben machen

abgesehen davon
Pragma:
Cache-Control:
ohne Wert sind ziemlich sinnlos, oder?
die anderen beiden Header mal als String ausgeben lassen, steht da das erwartete drin?

wobei mir schon das mit dem html/database connection error, komisch aufstößt...


ansonsten wäre ein Link zur Seite mal schön

 
wahsaga
24-01-2007, 23:35 
 
Original geschrieben von xlerator
nö er lädt das geparste php runter sprich das html da steht sogar noch schön "database connection error" drin
Wieso steht in einer Seite, die Dateien zum Download durchschleusen soll, HTML-Code drin?

Und wenn ein Datenbankfehler auftritt - warum kümmerst du dich dann nicht um den, suchst die Ursache und beseitigst ihn?

 
xlerator
25-01-2007, 09:32 
 
Also das "script" das die Dateien bereitstellen soll steht im Kopf meiner index.php, darunter kommt der Rest der Seite. Ich setze eine Variable $download=fileid wenn ein Link geklickt wird. Dadurch wird das Skript aktiviert.

In der index.php steht aber logischerweise auch der Rest der Seite, ich möchte eben keinen weiteren Seitenaufruf machen.

Es tritt kein Datenbankfehler auf, in der index.php die der Browser runterlädt steht das nur als HTML Code drin.

Diese Pragma:, Cache-Control:, Angaben habe ich aus einem Script kopiert, da steht explizit:


header("Cache-Control: ");# leave blank to avoid IE errors
header("Pragma: ");# leave blank to avoid IE errors
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".basename($url)."\";");
header("Content-length:".(string)(filesize($url)));


Link kann ich leider keinen geben da das auf unserem Testsystem liegt. Aber mehr als der Code oben ist sowieso nicht relevant für das Script. Aber hier mal das ganze Geraffel:



if(isset($download))
{

require_once("DB.php");
require_once("config.php");
$dbname = "*********";
$dsn = DB::connect("$dbtype://$dbuser:$dbpass@$dbhost/$dbname");


$download = "SELECT * FROM Files WHERE id = $download";
$download = $dsn->query($download);
$download->fetchInto($download,DB_FETCHMODE_ASSOC);
$dsn->disconnect();

if($download[id] != "")
{

require_once("config_write.php");
$dbname = "***********";
$dsn = DB::connect("$dbtype://$dbuser:$dbpass@$dbhost/$dbname");

$login = $_SESSION['loginname'];
$ip = getenv ("REMOTE_ADDR");

$confirm = "INSERT INTO Downloads
(id_file,login,ip)
VALUES
('$download[id]','$login','$ip');";


$dsn->query($confirm);
$dsn->disconnect();

$url="$download[pfad]";


header("Cache-Control: ");# leave blank to avoid IE errors
header("Pragma: ");# leave blank to avoid IE errors
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".basename($url)."\";");
header("Content-length:".(string)(filesize($url)));

}

unset ($dbtype);
unset ($dbuser);
unset ($dbpass);
unset ($dbhost);
}


Also wie gesagt: Dat funzt soweit alles, auch die Datenbankeinträge, nur dieser Download über den Header funktioniert nicht mit allen Browsern und wenn man einen Rechtsklick -> Speichern macht, dann lädt er zwar zum Beispiel eine Datei mit dem Namen "datei.xls" runter aber wenn man die aufmacht sieht man eine zerschossene Webseite, sprich er benennt die index.php in datei.xls um und lädt sie runter.

 
wahsaga
25-01-2007, 10:15 
 
Original geschrieben von xlerator
In der index.php steht aber logischerweise auch der Rest der Seite, ich möchte eben keinen weiteren Seitenaufruf machen.
Dann solltest du darauf verzichten, nach einem Download dem Client auch noch dein restliches HTML zu schicken - in dem du das Script danach abbrichst. Oder hast du das gemacht?
Es tritt kein Datenbankfehler auf, in der index.php die der Browser runterlädt steht das nur als HTML Code drin.
Aha, dann handelt es sich wohl lediglich um einen PHP-Scherz? Funny.

(Vielleicht tritt ja aber doch einer auf, und du bist nur zu ... um das zu checken - und von dieser Fehlerausgabe rührt auch der HTML-Code her ...?)

 
asp2php
25-01-2007, 10:34 
 
1. $confirm = "INSERT INTO Downloads (id_file,login,ip) VALUES ('$download[id]','$login','$ip');";
2. $url="$download[pfad]";

wegen 1. und 2. möchtest du bitte Grundlage in PHP nachholen.

zum Problem: du hast zwar header-Daten gesendet, aber wo bleibt die Datei? Ich sehe nichts davon :dontknow: Außerdem wie sieht der Inhalt von dieser runtergeladenen HTML-Datei aus

 
xlerator
25-01-2007, 12:30 
 
Original geschrieben von asp2php
1. $confirm = "INSERT INTO Downloads (id_file,login,ip) VALUES ('$download[id]','$login','$ip');";
2. $url="$download[pfad]";

wegen 1. und 2. möchtest du bitte Grundlage in PHP nachholen.


Keine ahnung worauf du hinauswillst

Original geschrieben von asp2php
zum Problem: du hast zwar header-Daten gesendet, aber wo bleibt die Datei? Ich sehe nichts davon :dontknow: Außerdem wie sieht der Inhalt von dieser runtergeladenen HTML-Datei aus

die datei wird mit der $url übergeben.
der inhat der html datei ist die geparste index.php.

 
Mathis
26-01-2007, 14:16 
 
Was hälst vom Einsatz von readfile () ?
Schau mal hier (http://www.php.net/manual/de/function.readfile.php).
Mit dieser Funktion streamst du eine Datei...

 
xlerator
26-01-2007, 14:22 
 
danke, ich habs mittlerweile gelöst, war ein problem mit dem relativen pfad... :D


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:38 Uhr.