Teil von  SELFPHP
  +++ SELFPHP CronJob-Service :: Jetzt auch als Professional-Version verfügbar! +++

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: SELFPHP Forum ::

Fragen rund um die Themen PHP? In über 120.000 Beiträgen finden Sie sicher die passende Antwort!  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

:: Qozido ::

Die Bilderverwaltung mit Logbuch für Taucher und Schnorchler.   

 
 
Dateidownload realisieren


Systemvoraussetzung

  • Linux
  • Windows
  • PHP 3
  • PHP 4
  • PHP 5

Datei(en)

download.php

Problem

Sicher standen Sie schon öfter vor dem Problem, dass Sie eine Datei zum Download anbieten wollten, diese aber nicht direkt angesprochen werden durfte. Gerade wenn Sie einen Download mitzählen möchten und den Wert in eine Datenbank speichern, müssen Sie die Dateien mit einer anderen Variante ausliefern.

Eventuell verkaufen Sie aber auch auf Ihrer Webseite spezielle Bilder, die nicht direkt abgerufen werden dürfen, sondern erst nach einer Freigabe. Sie werden nachfolgend eine Lösung für diese Probleme finden.


Lösung

Das Problem ist mit wenigen Handgriffen beseitigt. Sie sollten allerdings darauf achten, dass das Verzeichnis mit den Dateien nicht über den Browser zu erreichen ist – also außerhalb des Document-Root liegt.

Sie können alternativ auch ein Verzeichnis mit einem Verzeichnisschutz erstellen. Im Kapitel „Verschlüsselung/Prüfsummen“ finden Sie ein Programm, das Ihnen den Verzeichnisschutz automatisch erstellt.

Weiterhin müssen Sie darauf achten, dass Sie bei dem angebotenen Download jeweils auch die richtigen Mime-Typen mitliefern. Dabei besteht ein Mime-Typ aus zwei Bereichen, zum einen die Angabe des Medientyps und zum anderen die Angabe des Subtyps. Beide Werte sind lediglich mit einem Schrägstrich (/) voneinander getrennt.

Beispiel

image/png
application/pdf

Nachfolgend finden Sie eine Auflistung von verschiedenen und häufig genutzten MimeTypen. Falls Sie weitere Typen benötigen, erhalten Sie auf der folgenden Webseite eine sehr große Auswahl an verschiedenen Typen. Sie haben dort auch die Möglichkeit, die Liste der MimeTypen zu erweitern. Webseite von IANA (Internet Assigned Numbers Authority):

Content Types

text Textdateien
image Grafikdateien
video Videodateien
audio Sound-Dateien
application programmgebundene Dateien
multipart mehrteilige Daten (z. B. bei einem Formular inkl. Dateiupload)
message Nachrichten
model Dateien mit mehrdimensionalen Strukturen

Content Types/Subtypes

.avi video/x-msvideo   .ppt application/mspowerpoint
.class application/octet-stream   .ppz application/mspowerpoint
.css text/css   .ps application/postscript
.doc application/msword   .qt video/quicktime
.eps application/postscript   .ra audio/x-realaudio
.exe application/octet-stream   .ram audio/x-pn-realaudio
.gif image/gif   .rm audio/x-pn-realaudio
.gtar application/x-gtar   .rpm audio/x-pn-realaudio-plugin
.gz application/x-gzip   .rtf text/rtf
.htm text/html   .rtx text/richtext
.html text/html   .sgm text/sgml
.jpe image/jpeg   .sgml text/sgml
.jpeg image/jpeg   .tar application/x-tar
.jpg image/jpeg   .tcl application/x-tcl
.js application/x-javascript   .tif image/tiff
.midi audio/midi   .tiff image/tiff
.mov video/quicktime   .txt text/plain
.movie video/x-sgi-movie   .vrml model/vrml
.mp2 audio/mpeg   .wav audio/x-wav
.mp3 audio/mpeg   .wrl model/vrml
.mpe video/mpeg   .xbm image/x-xbitmap
.mpeg video/mpeg   .xlc application/vnd.ms-excel
.mpg video/mpeg   .xll application/vnd.ms-excel
.mpga audio/mpeg   .xlm application/vnd.ms-excel
.pbm image/x-portable-bitmap   .xls application/vnd.ms-excel
.pdf application/pdf   .xlw application/vnd.ms-excel
.png image/png   .xml text/xml
.pps application/mspowerpoint   .zip application/zip

Wie Sie sehen, ist die Liste bereits sehr groß, aber in der Regel braucht man nicht mehr als eine Hand voll, um gewisse Dateien ausliefern zu können.

Wir kümmern uns jetzt aber nicht weiter um diese Dateitypen, sondern schauen uns den Programmcode an. Zuerst werden wir uns mit der Funktion beschäftigen, die nachher die Datei ausliefern wird.

function makeDownload($file, $dir, $type)
   @param   string   $file
   @param   string   $dir
   @param   string   $type
   @return    void

Die Funktion makeDownload() erwartet als Parameter den Dateinamen für den Download, das Verzeichnis, in dem die Datei liegt (inkl. abschließendem Slash (/)!), und den Mime-Typ der jeweiligen Datei.

Wurden alle Parameter übertragen, wird zuerst der Mime-Type der Datei zum Browser gesendet (37) und im Anschluss daran der Dateiname (39) für die Speicherung auf dem Clientrechner. Sie können an dieser Stelle einen freien Namen für die Datei auswählen, müssen also nicht den realen Namen der Datei nehmen.

Zum Schluss müssen wir jetzt noch die Datei ausgeben. Dafür nutzen wir readfile() (41), lesen also die komplette Datei ein und geben Sie am Browser aus. Der Benutzer erhält z. B. in einer Zip-Datei den Dialog für das Speichern der Datei.

35:
36:
37:
38:
39:
40:
41:
42:
43:
function makeDownload($file$dir$type) {
    
    
header("Content-Type: $type");

    
header("Content-Disposition: attachment; filename=\"$file\"");

    
readfile($dir.$file);
    
}
Beispiel 6.2: download.php

Sie müssen zuerst zwei Konfigurationsparameter setzen. Zum einen benötigen Sie den Pfad (inkl. abschließendem Slash) zu Ihrem Downloadverzeichnis (51), zum anderen den Mime-Typen für die Datei (53). Falls Sie später mehrere verschiedene Dateien zum Download anbieten wollen, könnten Sie die Mime-Typen in ein Array schreiben und jeweils den richtigen Wert zuweisen.

Falls jetzt per GET ein Dateiname übermittelt wird, also nicht leer ist und die Variable keine Slashes (/) enthält, so können wir die Abfrage (55) weiter durchlaufen. Die Abfrage dient lediglich zum Schutz, damit niemand eine Datei außerhalb Ihres Verzeichnisses downloaden kann.

Im nächsten Schritt (56) überprüfen wir, ob die Datei vorhanden ist und sie somit zum Download angeboten werden kann. Wurde die Datei gefunden, so rufen wir unsere Funktion makeDownload() auf und übergeben den Dateinamen, das Verzeichnis und den Mime-Type der Datei.

51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
$dir '/is/htdocs/wp1042434_BDEO6BJ7VB/www/download/';

$type 'application/zip';

if(!empty(
$_GET['file']) && !preg_match('=/='$_GET['file'])) {
    if(
file_exists ($dir.$_GET['file']))     {
        
makeDownload($_GET['file'], $dir$type);
    }
        
}
Beispiel 6.3: download.php

Der Aufruf würde dann für eine Datei z.B. folgendermaßen aussehen:

  http://www.ihreDomain.de/download.php?file=dieDatei.zip


Der Download wurde sehr schnell gelöst. Sie könnten das Programm noch erweitern und vor allem sicherer machen. Wir möchten Ihnen hierfür ein paar Tipps geben, sodass Sie es selbst umsetzen können.

Erstellen Sie ein Array mit den Dateinamen, die zum Download angeboten werden. Wird jetzt die Variable $_GET[’file’] übermittelt, überprüfen Sie, ob der übermittelte Dateiname auch im Array vorkommt. Dies ist ein zusätzlicher Schutz, damit keine anderen Dateien ausgeliefert werden.

Erstellen Sie ein Array mit den Mime-Typen und setzen anhand der Dateiendung jeweils automatisch den richtigen Mime-Typ für die Datei.

Erzeugen Sie bei der Auslieferung der Dateien für die Header-Content-Disposition einen zufälligen Dateinamen und liefern diesen aus.

Es gibt also noch viele Ansätze, die man berücksichtigen kann. Lassen Sie Ihre Fantasie spielen, und erweitern Sie das Programm.

Sie sollten allerdings immer Ihre Downloads vorher mit verschiedenen Browsern testen, um sicher gehen zu können, dass die Dateien richtig ausgeliefert werden.



 


Dieses Skript aus dem SELFPHP KOCHBUCH wurde von SELFPHP unter dem "Tarif Mc500" von McAc.net-Webhosting erfolgreich ausgeführt und getestet!

Auf der Übersichtseite unter "McAc.net – Webhosting zu diesem Buch" finden Sie weitere Informationen zu dem Webhostingpaket, dass durch SELFPHP getestet wurde.


 




:: Premium-Partner ::

Webhosting/Serverlösungen


Premium-Partner LeaseWeb Germany GmbH
Premium-Partner MECO Systemhaus GmbH & Co. KG
Premium-Partner PSW GROUP GmbH & Co. KG
Premium-Partner BPI-Systeme
Premium-Partner Pixel X
Premium-Partner
 

:: SELFPHP Sponsoren ::


DM Solutions
Microsoft Deutschland GmbH
Sedo - Bei uns wird PHP großgeschrieben
hostfactory.ch - OptimaNet Schweiz AG
ZEND - The PHP Company
Kaspersky Labs
HighText iBusiness
SELFPHP Sponsoren
 

Qozido


© 2001-2013 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt