Dateien zum Download anbieten...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Man kann ja eine Datei per CGI zum download anbieten, wenn man diese auf Dateisystem-Ebene öffnet und zum Browser schickt, so wie hier: http://www.python-forum.de/viewtopic.php?p=14631#14631

Im prinzip möchte ich das selbe machen, aber nicht auf Dateisystemebene. Kann man irgendwie einen Bestimmten http-Header generieren, das der Browser weiß welche Datei er runter laden soll??? Vielleicht igentwie mit "Location: " ?!?!

Ich möchte es nämlich nicht auf Dateisystemebene machen, weil ich den Pfad/Dateinamen per POST/Get Parameter bekomme. Somit kann man schnell auch andere Dateien erhalten, die nicht für den Download bestimmt war. Ich möchte auch keine "allow"-Liste führen.

Mit einem direkten Link ist es auch nicht getan, weil es ein Python-Skript ist, welches dann der WebServer versucht auszuführen, es aber dafür nicht gedacht ist :(

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das geht nicht, da der HTTP Server das Skript immer ausführt, bevor er es sendet. Du kannst eben höchstens die Datei durch ein anderes Script tunneln und dann im Tunnel den Header Content-Disposition setzen.
Alternativ änderst du die Konfiguration des Webservers, dass in bestimmten Ordnern Scripte nicht ausgeführt werden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das tunneln will ich ja gerade nicht machen, s. erstes Posting...
Leonidas hat geschrieben:Alternativ änderst du die Konfiguration des Webservers, dass in bestimmten Ordnern Scripte nicht ausgeführt werden.
Das habe ich versucht, aber irgendwie hab ich das nicht gebacken bekommen:

Code: Alles auswählen

# http://httpd.apache.org/docs/2.0/mod/core.html#options
Options -ExecCGI

# http://httpd.apache.org/docs/2.0/mod/mod_mime.html#addtype
AddType text/plain .py
DefaultType text/plain

<Location /_Downloads>
    ForceType text/plain
</Location>
Er will dennoch das Skript ausführen... Eine doofe Möglichkeit ist das Skript BlaBla.py.txt zu benennen :(

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jens hat geschrieben:Mit einem direkten Link ist es auch nicht getan, weil es ein Python-Skript ist, welches dann der WebServer versucht auszuführen, es aber dafür nicht gedacht ist :(
Hi Jens!

Vielleich doch! Du könntest doch einen Download-Ordner über HTACCESS so einrichten, dass die Python-Skripte dieses Ordners nicht interpretiert werden.

http://httpd.apache.org/docs/2.0/howto/htaccess.html
http://httpd.apache.org/docs/2.0/howto/cgi.html
http://httpd.apache.org/docs/2.0/mod/core.html#options

Code: Alles auswählen

<Directory /usr/local/apache2/htdocs/somedir>
  Options -ExecCGI
</Directory>
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Jens!

Eine Alternative könnte sein, dass ein CGI-Skript den Header setzt, die zu übertragende Datei ausliest und zurück gibt. Gibt es bei CGI auch die Möglichkeit, einen Bytestream, statt mit "print" einen Text, zurück zu liefern?

http://www.dzug.org/mailinglisten/zope/ ... 3205707294

Daraus resultierender Pseudocode, da ich CGI nicht kenne:

Code: Alles auswählen

f = file("irgendeineDatei.pdf", "rb")
pdf = r.read()
RESPONSE.setHeader('content-type', 'application/pdf')
RESPONSE.setHeader('content-length', str(len(pdf)))
RESPONSE.setHeader('content-disposition', 'attachment; filename=seavas.pdf')
RESPONSE.write(pdf)
f.close()
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das hatte ich schon im Eingangsposting geschrieben, das das keine Lösung für mich ist:
jens hat geschrieben:Ich möchte es nämlich nicht auf Dateisystemebene machen, weil ich den Pfad/Dateinamen per POST/Get Parameter bekomme. Somit kann man schnell auch andere Dateien erhalten, die nicht für den Download bestimmt war. Ich möchte auch keine "allow"-Liste führen.

Ich bekomme es aber auch nicht hin, das der Webserver die Datei nicht ausführt...
Vielleicht ist der Dateinamen *.py.txt doch noch eine Option... Oder ich überleg mir das ganz anderes ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jens hat geschrieben:Ich bekomme es aber auch nicht hin, das der Webserver die Datei nicht ausführt...
Hi Jens!

Falls die Verwendung von .htaccess-Dateien vom Provider erlaubt wurde, dann sollte es eigentlich keine große Sache sein.

1. Neue Datei mit dem Namen ".htaccess" innerhalb des Download-Ordners erstellen.
2. Leserecht für ALLE vergeben
3. .htaccess-Datei mit Inhalt füllen:
Das Einzige, was in dieser Datei stehen muss ist:

Code: Alles auswählen

Options -ExecCGI
Wenn das nicht geht, dann musst du wohl deinen Provider darum bitten, den Download-Ordner mit der "Directory"-Direktive als CGI-Ordner auszunehmen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das hab ich auch probiert... Normalerweise kann ich .htaccess auch benutzen, aber in dem Fall scheint es nicht zu klappen :(

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Johi
User
Beiträge: 22
Registriert: Sonntag 21. November 2004, 20:08

vielleicht, dass du an die zu downloadenden dateien oben einen header anfügt, der die datei selbst nochmal einliest, den header abschneidet und dann an den browser schickt?
Antworten