Datei mit selbst erstelltem Format herunterladen
Thomas
- programmiertechnik
Hallo Leute,
ich programmiere eine Suchseite für eine Datenbank. In der Datenbank gibt es viele Dateien, die in einem selbst erstellten Komprimierungsformat vorliegen. Diese Dateien sollen die Benutzer per Links direkt herunterladen können. Bei einem Linksklick klappt das aber nur beim IE, Firefox dagegen öffnet die Datei leider immer im Browser, egal was ich mache.
Ich habe schon so ziemlich alles ausprobiert, was ich hier im Forum gefunden habe und nichts funzt.
Jede der folgenden Zeilen lässt Firefox völlig kalt:
<a href=”datei.abc” type=”application/abc”>Datei</a>
<a href=”datei.abc” type=”application/octet-stream”>Datei</a>
Die Header per PHP zu ändern führte dazu, daß beim Aufruf der PHP-Seite, die das Suchformular und die Ergebnisse darstellt, gleich die ganze Seite als solche per Download angeboten wurde:
header("Content-Type:application/abc");
header("Content-Disposition:attachment");
Kann mir jemand helfen?
Schon mal danke & Gruß
Thomas
Hello,
<a href=”datei.abc” type=”application/abc”>Datei</a>
<a href=”datei.abc” type=”application/octet-stream”>Datei</a>
header("Content-Type:application/abc");
header("Content-Disposition:attachment");
(1) kombiniere beides oder (2) stelle den Server richtig ein:
(1) Liefere datei.abc nicht direkt aus, sondern lass sie von einem PHP-Skript ausliefern (exemplarisch: href="download.php?file=datei.abc") -> dort kannst du den "richtigen" Content-Type senden.
(2) bringe deinem Server bei, dass .abc-Dateien mit einem anderen Content-Type auszuliefern sind.
MfG
Rouven
Hallo Rouven,
danke für deine Antwort.
Ich gehe so vor, wie du bei (1) schreibst.
In der Datei "download.php" steht nun drin:
<?php
header("Content-Type:application/x-abc");
header("Content-Disposition:attachment");
$datei = $_GET['datei'];
echo "<a href='../" . $datei . "' type='application/x-abc'>datei</a>";
?>
Leider führen die zwei header-Zeilen nur dazu, daß nun die Datei "download.php" zum Öffnen/Download angeboten wird und der Link weiter unten völlig ignoriert wird.
Gruß
Thomas
Hello,
<a href=”datei.abc” type=”application/abc”>Datei</a>
<a href=”datei.abc” type=”application/octet-stream”>Datei</a>header("Content-Type:application/abc");
header("Content-Disposition:attachment");
(1) kombiniere beides oder (2) stelle den Server richtig ein:(1) Liefere datei.abc nicht direkt aus, sondern lass sie von einem PHP-Skript ausliefern (exemplarisch: href="download.php?file=datei.abc") -> dort kannst du den "richtigen" Content-Type senden.
(2) bringe deinem Server bei, dass .abc-Dateien mit einem anderen Content-Type auszuliefern sind.
MfG
Rouven
Hello,
Ich gehe so vor, wie du bei (1) schreibst.
nope, tust du nicht.
In der Datei "download.php" steht nun drin:
echo "<a href='../" . $datei . "' type='application/x-abc'>datei</a>";
was machst du als? Richtig, du schreibst einen HTML-Link raus. Warum sollte das den Browser interessieren? Noch schlimmer, wenn du jetzt einen unbekannten Content-Type sendest, dann kann er das ja noch nicht mal als HTML identifizieren...
Du willst was anderes, glaub mir, ich weiß das :-)
Du willst in der download.php den INHALT von deiner Datei anbieten, nicht einen Link darauf, vgl. PHP-FAQ.
MfG
Rouven
Hallo Rouven,
Du willst was anderes, glaub mir, ich weiß das :-)
Du willst in der download.php den INHALT von deiner Datei anbieten, nicht einen Link darauf, vgl. PHP-FAQ.
Habe ich beides getestet:
Der redirect führt immer dazu, daß die Datei direkt im Browser geöffnet wird.
wenn ich den Download innerhalb von PHP abhandeln lasse, wird wieder nur die PHP-Seite selbst zum öffnen/speichern angeboten. Der Code dazu sieht so aus:
<?php
header("Content-Type: application/x-abc");
header("Content-Disposition: attachment; filename="a.abc"");
$datei = $_GET['datei'];
$address = "Location: http://adresse_des_webservers/" . $datei;
readfile($address);
?>
Die Angabe von "a.abc" im header bewirkt nur, daß die PHP-Seite unter diesem statt ihrem eigenen Namen zum öffnen/speichern angeboten wird.
Gruß
Thomas
Hallo Thomas,
$address = "Location: http://adresse_des_webservers/" . $datei;
readfile($address);
Was soll das denn werden? ;-)
readfile() erwartet als Parameter einen Dateinamen oder eine URL und nicht eine HTTP-Headerangabe. Also etwas in dieser Richtung:
readfile('http://www.example.org/'.$datei);
Schöne Grüße,
Johannes
Hallo Rouven, Cheatah und Johannes,
ich habe das Problem nun so gelöst:
in der Datei "mime.types" habe ich beim Eintrag "application/octet-stream" einfach unsere Dateiendung noch zu den vorhandenen hinzugefügt:
application/octet-stream bin dms lha lzh exe class so dll dmg abc
Dann Apache neu gestartet, im Link zur Datei natürlich den Eintrag
type='application/octet-stream'
nicht vergessen und es geht!!! :-))
Vielen Dank für eure Hilfe
Grüße
Thomas
Hi,
Jede der folgenden Zeilen lässt Firefox völlig kalt:
ja, tut es.
<a href=”datei.abc” type=”application/abc”>Datei</a>
Abgesehen von den ungültigen Anführungszeichen und dem Umstand, dass das type-Attribut höchstens Auswirkungen hat, die Du garantiert nicht meinst: Diesen MIME-Type gibt es nicht. Er muss "application/x-abc" heißen.
Die Header per PHP zu ändern führte dazu, daß beim Aufruf der PHP-Seite, die das Suchformular und die Ergebnisse darstellt, gleich die ganze Seite als solche per Download angeboten wurde:
Warum willst Du auch etwas anderes mit dem MIME-Type versehen als diejenige Ressource, die ihn haben soll?
Cheatah
Hallo Cheatah,
<a href=”datei.abc” type=”application/abc”>Datei</a>
Abgesehen von den ungültigen Anführungszeichen und dem Umstand, dass das type-Attribut höchstens Auswirkungen hat, die Du garantiert nicht meinst: Diesen MIME-Type gibt es nicht. Er muss "application/x-abc" heißen.
Die Anführungszeichen kamen durch copy&paste hier ins Forum. Danke für den Tip bzgl. des MIME-Typen, ich habe ihn geändert.
Die Header per PHP zu ändern führte dazu, daß beim Aufruf der PHP-Seite, die das Suchformular und die Ergebnisse darstellt, gleich die ganze Seite als solche per Download angeboten wurde:
Warum willst Du auch etwas anderes mit dem MIME-Type versehen als diejenige Ressource, die ihn haben soll?
Ok, ich lasse diese zwei header-Zeilen weg. Leider führt aber nach wie vor die Zeile
<a href='datei.abc' type='application/x-abc'>datei</a>
dazu, daß die Datei in Firefox direkt geöffnet wird, also keine Änderung. :-(
Gruß
Thomas
Hi,
Abgesehen von [...] dem Umstand, dass das type-Attribut höchstens Auswirkungen hat, die Du garantiert nicht meinst: [...]
Leider führt aber nach wie vor die Zeile
<a href='datei.abc' type='application/x-abc'>datei</a>
dazu, daß die Datei in Firefox direkt geöffnet wird, also keine Änderung. :-(
was exakt dem entspricht, was ich sagte.
Warum willst Du auch etwas anderes mit dem MIME-Type versehen als diejenige Ressource, die ihn haben soll?
Ok, ich lasse diese zwei header-Zeilen weg.
Mir ist nicht klar, wie Du aufgrund des von mir Gesagten zu dieser Schlussfolgerung kommst.
Cheatah
Eine Sache, die mir noch einfällt: ich habe die Datenbank und die PHP-Dateien sowohl lokal auf meinem PC laufen, als auch auf unserem Server.
Wenn ich den Download-Link (in Firefox mit links) lokal anklicke, dann kann ich die Datei herunterladen, so wie ich es möchte. Nur auf dem Server geht es nicht. Ich erwähne das erst jetzt, weil bisher vieles lokal ging, was dann auf dem Server nicht mehr lief...
Aber vielleicht liegt der Unterschied in der httpd.conf vom Apache Webserver - würde ein Eintrag hier Abhilfe schaffen?