Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Traffic sparen: Wie Datei-Download nur über die Website? (https://www.delphipraxis.net/111923-traffic-sparen-wie-datei-download-nur-ueber-die-website.html)

Matze 11. Apr 2008 19:43


Traffic sparen: Wie Datei-Download nur über die Website?
 
Moin zusammen,

mit einer htaccess-Datei dieses Inhalts verhindere ich, dass bestimmte Dateitypen direkt über den Browser heruntergeladen werden können:

Code:
<FilesMatch "\.(zip|pdf|doc|xls)$">
   deny from all
</FilesMatch>
Wie kann ich allgemein den Download über die Website ermöglichen? Muss ich da manuell irgendwie diverse Header senden oder wie macht man das?

Ein schönes Wochenende wünscht
Matze

hedie 11. Apr 2008 20:26

Re: Wie Datei-Download nur über die Website möglich?
 
Möchtest du den Download mittels PHP Realisieren?

Dann sieht der Downloader nicht wo sich die eigentliche
Datei befindet.

Damit kannst du selbst den Speed Einstellen

Matze 11. Apr 2008 20:34

Re: Wie Datei-Download nur über die Website möglich?
 
Hallo Claudio,

jupp, ich habe es vergessen zu erwähnen, das soll mit PHP ablaufen.

Wie mache ich das denn genau?

Da du es angesprochen hast: Die Geschwindigkeit möchte ich zwar nicht drosseln und ich bezweifel auch, dass das mit PHP geht, aber falls das gehen sollte, wäre es interessant zu wissen, wie so etwas realisierbar wäre. Aber wie gesagt, das brauche ich nicht.

Grüße

alcaeus 11. Apr 2008 22:33

Re: Wie Datei-Download nur über die Website möglich?
 
Moin Matze,

wenn du die Datei mit readfile(), file_get_contents() oder fopen() anfasst, hat die htaccess gar keine Bedeutung. Diese greift nur bei der direkten Auslieferung durch den Indianer.

Nehmen wir an (GAANZ unsicheres Beispiel), du erwartest an der URL nen File-Parameter:
Code:
header('Content-Disposition: attachment');
header(...); // Die korrekten Header findest du bspw. im 0815-Attachment-MOD fuers phpBB

readfile($_GET['file']);
Natuerlich musst du noch pruefen obs die Datei gibt, ob er drauf zugreifen gibt, usw. So koennte man naemlich auch ne PHP-Datei ziehn, und damit mein ich nicht den Code nach dem Ausfuehren. Also immer schoen brav mit IDs arbeiten oder so.

Greetz
alcaeus

Matze 12. Apr 2008 08:07

Re: Wie Datei-Download nur über die Website möglich?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Andy,

danke für deine Antwort. Das ist das, was ich vermutet hatte. Ich muss es also manuell über diverse Header lösen.
Ich bin mir nur nicht ganz sicher, ob PHP so konfiguriert ist, dass dies geht, denn in gewisser Weise stellt das öffnen von Dateien mit PHP ein Sicherheitsrisiko dar.
Die Gültigkeit wird übrigens überprüft und zwar anhand eines Datei-Hashs (ich hoffe nur, dieser tritt nicht mal doppelt bei 2 verschiedenen Dateien auf). Im Endeffekt läuft's aber dann über eine ID ab, die beim ersten Eintragen in die DB erzeugt wird.

Das unschöne ist eben auch, dass ich pro Dateityp einen anderen Header senden muss. Aber dann führt wohl kein anderer Weg dran vorbei. Ich teste mal, ob das funktioniert.

Btw: Ich schaue da übrigens nicht in einem phpBB-Mod nach sondern auf SelfHTML. ;)

Grüße


Edit: Ich habe es nun so (nur lokal getestet):

Code:
header('Content-Disposition: attachment; filename="..."');
header('Content-Type: application/pdf');

readfile(...);
Der Download-Dialog ist aber nicht ganz richtig, denn dieser stellt das Icon dar, mit dem eine html-Datei verknüpft ist und zeigt natürlich dann auch entsprechend die falsche Standardanwendung an (s. Anhang).
Lasse ich den Dateinamen (filename="...") übrigens weg, dann steht dort der Name der Datei, die im Browser aufgerufen wird (Bsp: id26.html).

Das ist ein reiner Schönheitsfehler, denn die Datei wird korrekt heruntergeladen. Es wäre aber sinnvoll, wenn der Browser das auch richtig erkennen würde.

Was ist daran noch falsch?

Matze 12. Apr 2008 15:11

Re: Wie Datei-Download nur über die Website möglich?
 
Hallo,

durch langes Herumprobieren hat sich das Problem nun erledigt. Nach readfile fehlte ein exit. Mit diesem geht alles einwandfrei, wieso auch immer.

Grüße

alcaeus 12. Apr 2008 17:46

Re: Wie Datei-Download nur über die Website möglich?
 
Zitat:

Zitat von Matze
Ich bin mir nur nicht ganz sicher, ob PHP so konfiguriert ist, dass dies geht, denn in gewisser Weise stellt das öffnen von Dateien mit PHP ein Sicherheitsrisiko dar.

Das musst du mir erklaeren. An einem fopen(), fread(), fclose() auf ne Datei ist nichts gefaehrliches dran, jedenfalls nichts gefaehrlicheres als in Delphi. Kritisch wirds erst, wenn du den Dateinamen direkt aus User-Daten (z.B. GPC-Daten) zusammensetzt.

Greetz
alcaeus

hedie 12. Apr 2008 18:08

Re: Wie Datei-Download nur über die Website möglich?
 
Hallo

Geschwindigkeits Regelung mittels PHP Funktioniert einwandfrei...

Ich benutze das selbst in eigenen Scripten

Falls noch interesse Bestehen sollte bitte melde dich...

Matze 12. Apr 2008 18:47

Re: Wie Datei-Download nur über die Website möglich?
 
Zitat:

Zitat von alcaeus
Kritisch wirds erst, wenn du den Dateinamen direkt aus User-Daten (z.B. GPC-Daten) zusammensetzt.

Ja stimmt, wenn man das ausschließen kann, sollte das sicher sein. Ich dachte nur, das wird von manchen Hostern deaktiviert (file_get_contents), doch dem ist wohl nicht so, zum Glück. :) Online funktioniert das bei mir auch einwandfrei.

@Claudio: Das würde mich brennend interessieren, da ich mir nicht vorstellen kann, wie das gehen soll. Ich dachte immer, das muss direkt am Server konfiguriert werden (Bsp: Proxy).
Da das nicht zum ursprünglichen Thema passte, habe ich den Thementitel geändert und nun passt auch das hier her. ;)

hedie 12. Apr 2008 19:14

Re: Traffic sparen: Wie Datei-Download nur über die Website?
 
Sehr gut...

Funktionieren tut das zu 100%

Das Prinzip ist einfach.
Das Script überträgt eine gewisse Anzahl an Bytes und
macht dan einfach eine Pause.

Und so kann man auf das KB Genau den Speed Regeln....
Das ist ein feine sache.

Damit könnte man Registrierten Usern mehr Speed Bieten
als nicht registrierten. Ich benutze das Script auf meine
eigenen Filestore http://filestore.endasmedia.ath.cx

Hier nun das Script

Code:
$file = $row_download['file_Path']; // Datei aus Array laden
$speed = 5; // 8,5 kb/s download rate limit
if(file_exists($file) && is_file($file)) { //Überprüfen ob Datei Existiert
    header("Cache-control: private");
    header("Content-Type: application/octet-stream");
    header("Content-Length: ".filesize($file));
    header("Content-Disposition: filename=$file" . "");

    flush();
    $fd = fopen($file, "r");
   while(!connection_aborted()){
    while(!feof($fd)) {
        echo fread($fd, round($speed*1024));
        flush();
        sleep(1);
    }
    fclose ($fd);
}
}
Bei mir Funktioniert der Code....
Viel Spass


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz