Download starten und Datei danach vom Server löschen
HP-Bauer
- php
0 Tom0 Matti Mäkitalo0 Der Martin0 GrandmasterA
Hallo,
wie würdet ihr es lösen, wenn ein Dateidownload automatisch gestartet werden soll und die Datei danach automatisch vom Server gelöscht werden soll?
MfG
HP-Bauer
Hello,
wie würdet ihr es lösen, wenn ein Dateidownload automatisch gestartet werden soll und die Datei danach automatisch vom Server gelöscht werden soll?
Das ist gar nicht so trivial, wie es sich anhört.
Wenn Du HTTP benutzt, besteht keine Möglichkeit festzustellen, ob der Download für den Client auch erfolgreich gewesen ist.
Du müsstest also entweder in Kauf nehmen, dass keine Rückmeldung darüber vorhanden ist, oder Du müsstest ein anderes Protokoll benutzten. Dies würde aber einen Medienbruch bedeuten.
Ggf. könnte man mit einem Java-Applet arbeiten. Da wird es dann aber schon langsam unheimlich für den Client.
Wenn Du das Risiko des Übertragungsfehlers bzw. Clientfehlers eingehen willst, dann könntest Du einfach nach dem angebotenen Download die Datei löschen. Außerdem kann z.B. der Apache auch die Response inn der Größe genau loggen, sodass Du über einen parametrisierten Request genau feststellen könntest, welcher Logbucheintrag welchem Request zugeordnet werden kann und ob er zur Dateigröße passt.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
wie würdet ihr es lösen, wenn ein Dateidownload automatisch gestartet werden soll und die Datei danach automatisch vom Server gelöscht werden soll?
das ist tatsächlich kein einfaches Problem. Zunächst eine Definitionsfrage: was bedeutet "danach". Nachdem der Download-Request fertig ist? Oder wenn der Download abgeschlossen ist?
Ersteres kannst du noch einigermaßen bequem abfragen: du lieferst die gewünschte Ressource nicht direkt aus, sondern über eine Download-Instanz, z.B. ein PHP-Skript. Dass muss im wesentlichen nicht mehr können als:
Damit fragst du aber nicht (!) ab, ob der Client die Ressource auch korrekt empfangen hat, ist also u.U. nicht das, was du willst.
Bis die Tage,
Matti
Hi!
- die gewünschte Ressource einlesen,
- den Content-Type der Ressource ausgeben
- die Ressource ausgeben
- die Ressource löschen.
Übrigens: Punkt 1 und 3 kann man zusammengefasst mit readfile() erledigen.
(Noch ein übrigens: Der Begriff Datei statt Ressource wäre (außer für Punkt 2) konkreter und damit richtiger gewesen, denn eine Datei ist zwar auch eine Ressource, aber für PHP ist das tatsächlich eine Datei.)
Lo!
Hi,
- die gewünschte Ressource einlesen,
- den Content-Type der Ressource ausgeben
- die Ressource ausgeben
- die Ressource löschen.
Übrigens: Punkt 1 und 3 kann man zusammengefasst mit readfile() erledigen.
Hatte ich auch überlegt, aber dann müsste man die Datei nochmals öffnen, um den Typ zu identifizieren (wenn man diesen nicht an der Endung ablesen kann/will).
(Noch ein übrigens: Der Begriff Datei statt Ressource wäre (außer für Punkt 2) konkreter und damit richtiger gewesen, denn eine Datei ist zwar auch eine Ressource, aber für PHP ist das tatsächlich eine Datei.)
Das ist korrekt. Ich wollte damit ausdrücken, dass die Datei gemeint ist, welche als ursprüngliche Ressource heruntergeladen werden sollte. In dem Zusammenhang war damit also die Original-Ressource aus dem Kontext gemeint. Bezogen auf das PHP-Skript ist es tatsächlich nur eine Datei (von abwegigen Konstruktionen, bei denen das Downloadskript tatsächlich auf eine externe Ressource zugreift. mal abgesehen... egal).
Übrigens (das kann ich auch :-)): richtig_er_?
Bis die Tage,
Matti
Hi,
wie würdet ihr es lösen, wenn ein Dateidownload automatisch gestartet werden soll und die Datei danach automatisch vom Server gelöscht werden soll?
ich würde denjenigen, der diese Forderung stellt, herzlich bitten, ihre Konsequenzen nochmal zu überdenken und die Forderung dann zurückzuziehen.
Ciao,
Martin
Ich würde in einer DB den Dateinamen + Timestamp der Anfrage auf die Datei speichern und nach 24 Stunden die zugehörige Datei und danach den DB-Eintrag löschen (bzw. per cronjob regelmäßig alle Dateien, deren Timestamp älter als 24 Stunden ist). Bis dahin sollte der Download erfolgreich gewesen sein bzw. der Nutzer hatte genügend Zeit.