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
Dateien zum Download anbieten...
-
- 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.
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
- 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...
Er will dennoch das Skript ausführen... Eine doofe Möglichkeit ist das Skript BlaBla.py.txt zu benennen
Das habe ich versucht, aber irgendwie hab ich das nicht gebacken bekommen:Leonidas hat geschrieben:Alternativ änderst du die Konfiguration des Webservers, dass in bestimmten Ordnern Scripte nicht ausgeführt werden.
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>
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi Jens!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
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>
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- 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:
lg
Gerold
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()
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- 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:
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
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
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi Jens!jens hat geschrieben:Ich bekomme es aber auch nicht hin, das der Webserver die Datei nicht ausführt...
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
lg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.