SonyUserforum

SonyUserforum (https://www.sonyuserforum.de/forum/index.php)
-   Café d`Image (https://www.sonyuserforum.de/forum/forumdisplay.php?f=94)
-   -   Link zum Download eines Bildes setzen - wie? (https://www.sonyuserforum.de/forum/showthread.php?t=42937)

Bendix 23.09.2007 21:16

Link zum Download eines Bildes setzen - wie?
 
Hallo!

Ausgangslage:
Ich biete Bekannten ein paar Bilder online zum Anschauen an. Gleichzeitig sollen sie die Möglichkeit zum Download einer printfähigen Dateigröße erhalten. Dazu setze ich einen Button mit Link auf die größere Datei.

Problem:
Mir fehlt der PHP-Code, mit dem ich für so ein Bild einen Download setzen kann, der den Dialog "Speichen unter" öffnet, aber nicht das Bild im Fenster öffnet. Ich habe die Bilder wohlgemerkt nicht in einer Datenbank (wie hier das Forum), sondern ganz profan im Verzeichnis liegen.
Geht das überhaupt mit ein bisschen PHP-Code unter dem Button oder komme ich um eine größere Lösung nicht drumrum?

Herzlichen Dank schonmal,
Ralf

baerlichkeit 23.09.2007 21:34

Hallo Ralf,

eine ganz pragmatische Lösung, die immer funktioniert :)

Setze den Link rein und schreibe in Klammern dahinter (rechte Maustaste - Bild speichern unter) oder sowas... :D

Ansonsten, wenn du die eh händisch hochlädst. Verpack sie doch als ZIP, dann sollte der Browser automatisch den speichern-Dialog anzeigen...

Viele Grüße
Andreas

Bendix 23.09.2007 21:53

Zitat:

Zitat von baerlichkeit (Beitrag 540142)
Hallo Ralf,
eine ganz pragmatische Lösung, die immer funktioniert :)

Setze den Link rein und schreibe in Klammern dahinter (rechte Maustaste - Bild speichern unter) oder sowas... :D

...dann klicken einige wieder ins Bild. Und der "Speichern unter.."-Text lautet in jedem Browser anders. Schon die Menüauswahl unter der rechten Maustaste wird einige verwirren. Ich suche nach der für den Besucher einfachsten Lösung: Klick auf den Button, bestätigen (nochmal Klick) - und fertig.

Zitat:

Zitat von baerlichkeit (Beitrag 540142)
Ansonsten, wenn du die eh händisch hochlädst. Verpack sie doch als ZIP, dann sollte der Browser automatisch den speichern-Dialog anzeigen...

...dann müssen die wieder mit ZIP umgehen können. Vielen ist das kein Problem. Aber wozu habe ich einen Computer, wenn ich mit Workarounds arbeiten muss? Ich suche nach wie vor nach der 2-Klick-Lösung. Vielleicht gibts hier ja einen Spezi, der das drauf hat.

Dank & Gruß,
Ralf

baerlichkeit 23.09.2007 22:56

Hallo Ralf,
ich verstehe, also eine wasserdichte Lösung... ;)

Ich habe so meine Zweifel, dass das geht, es wird immer irgendeinen Browser geben, der da rum zickt...

Aber hier kannst du ja mal lesen, vielleicht ist es das was du suchst?

http://www.php-faq.de/q/q-datei-download.html

Viele Grüße
Andreas

Tobi. 24.09.2007 10:06

Zitat:

Zitat von Bendix (Beitrag 540131)
Mir fehlt der PHP-Code, mit dem ich für so ein Bild einen Download setzen kann, der den Dialog "Speichen unter" öffnet, aber nicht das Bild im Fenster öffnet. Ich habe die Bilder wohlgemerkt nicht in einer Datenbank (wie hier das Forum), sondern ganz profan im Verzeichnis liegen.

Mal so als spontane Idee, kaum getestet:
Code:

<?php
// Pruefen, ob der Parameter 'bild' beim Aufrufen des Skripts gesetzt wurde
if (isset ($_GET['bild']))
        $bild = $_GET['bild'];
elseif (isset ($_POST['bild']))
        $bild = $_POST['bild'];

if (isset ($bild)) {
        // Pruefen, ob es sich um ein jpg handelt und ob der Nutzer nicht versucht,
        // sich in einen anderen Ordner zu hangeln
        if (is_file ($bild) && strpos ($bild, '/') == 0 && strpos ($bild, 'jpg') != 0) {
               
                // Laden des Bildes
                $ausgabe = imagecreatefromjpeg ($bild);
               
                // Header an den Browser schicken
                header ("Content-type: image/jpeg");
                header ("Content-Disposition: attachment; filename=".$bild.".jpg");
               
                // Bild an den Browser schicken
                imagejpeg ($ausgabe);
        }
        else
                echo ("Keine erlaubte Datei!");
}

?>

Du musst das in einer Datei speichern und diese dann mit ?bild=foto.jpg aufrufen oder den Parameter 'bild' als post übermitteln, also mit einem Formular. Beide Wege sollten klappen.

HTH
Tobi

Bendix 24.09.2007 15:52

@Tobi:
Vielen Dank:!:
Das ist das erste Skript dieser Art, das überhaupt sowas ähnliches macht was ich suche. Auf den zahlreichen Internetseiten zu PHP-Skripten habe ich reichlich Schnickschack gefunden, den ich nicht brauche.

Dieses Skript funzt im Prinzip, zeigt aber 3 Merkwürdigkeiten:
1. Es öffnet sich ein weiteres, leeres Browserfenster
2. Das Bild erhält eine weitere Endung '.jpg', also doppelt
3. Das Bild wird zwar komplett heruntergeladen, hat aber nur noch die halbe Dateigröße. Das ist einerseits löblich, aber ich kontrolliere die Dateigrößen gern selbst und hatte sie bereits größenoptimiert.

Hast du das selbst geschrieben oder irgendwoher? Die Sicherheitsfeatures brauche ich übrigens nicht, die könnten raus.

@baerlichkeit:
Die Köhntopp-Seite bietet sowas ähnliches, aber zu umständlich für mich. Die Beschreibung wurde mir auch nicht ganz klar, ich bin (noch) kein PHP-Kenner.

Gruß, Ralf

Tobi. 24.09.2007 16:29

Zitat:

Zitat von Bendix (Beitrag 540493)
Dieses Skript funzt im Prinzip, zeigt aber 3 Merkwürdigkeiten:
1. Es öffnet sich ein weiteres, leeres Browserfenster

Das liegt wohl an deiner Einbindung -- hier kann ich das nicht provozieren. Ich lade einfach die Datei in Opera direkt (Als http://localhost/misc/bild.php?bild=bild.jpg), dabei wird das im gleichen Fenster geöffnet.
Zitat:

2. Das Bild erhält eine weitere Endung '.jpg', also doppelt
Das lag am .jpg im zweiten header(), jetzt isses weg (siehe unten).
Zitat:

3. Das Bild wird zwar komplett heruntergeladen, hat aber nur noch die halbe Dateigröße. Das ist einerseits löblich, aber ich kontrolliere die Dateigrößen gern selbst und hatte sie bereits größenoptimiert.
Ja, das liegt am einlesen als Bild in php und dann ausgeben. Die von baerlichkeit verlinkte Lösung mit readfile() ist wesentlich eleganter, denn da wird garantiert nichts verändert. readfile() reicht die Datei einfach geradewegs durch.
Hier mein Skript damit:
Code:

<?php
// Pruefen, ob der Parameter 'bild' beim Aufrufen des Skripts gesetzt wurde
if (isset ($_GET['bild']))
        $bild = $_GET['bild'];
elseif (isset ($_POST['bild']))
        $bild = $_POST['bild'];

if (isset ($bild)) {
        // Pruefen, ob es sich um ein jpg handelt und ob der Nutzer nicht versucht,
        // sich in einen anderen Ordner zu hangeln
        if (is_file ($bild) && strpos ($bild, '/') == 0 && strpos ($bild, 'jpg') != 0) {

                // Header an den Browser schicken
                header ("Content-type: image/jpeg");
                header ("Content-Disposition: attachment; filename=".$bild);
                readfile ($bild);
        }
        else
                echo ("Keine erlaubte Datei!");
}

?>

Zitat:

Hast du das selbst geschrieben oder irgendwoher?
Das habe ich mir spontan aus den Fingern gesogen, sozusagen zum Wachmachen heute morgen.
Zitat:

Die Sicherheitsfeatures brauche ich übrigens nicht, die könnten raus.
Ich halte Sicherheitsfeatures für wichtig, weil man sonst jede Menge quatsch mit einem solchen Skript machen könnte. Man könnte zum Beispiel "../index.php" übergeben und sich damit deine index.php als Klartext übertragen lassen, was du ja sicherlich nicht möchtest. Außerdem sind sie bereits drin und fressen nichts...

Tobi

Bendix 24.09.2007 21:25

Danke, Sir :D Tobi, das klappt prima. Die Öffnung eines neuen Fensters/Tabs kam, weil ich noch "target='_blank'" stehen hatte.

Das war ja direkt eine honorarfähige Auftragsleistung. Machst du sowas den ganzen Tag? Ich würde dir im Gegenzug gern einen Gefallen tun, wenns denn je dazu käme.

Gruß, Ralf

Tobi. 24.09.2007 21:34

Zitat:

Zitat von Bendix (Beitrag 540641)
Das war ja direkt eine honorarfähige Auftragsleistung.

Nö, das war gerade richtig heute morgen. :-)
Zitat:

Machst du sowas den ganzen Tag?
Nein, eigentlich nicht. Nur gelegentlich, aber dann JSP und nicht php.
Zitat:

Ich würde dir im Gegenzug gern einen Gefallen tun, wenns denn je dazu käme.
Eigentlich ists nicht nötig, aber bei Bedarf komme ich gerne darauf zurück. :-)

Tobi


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:41 Uhr.