MP4 Datei Download lokaler webserver?
Hi,
ich habe einen minimalen Webserver mit Python aufgesetzt und möchte gerne von meinem Handy aus (iPhone) mp4-Dateien von diesem herunterladen.
Ich benutze nur das Dateiverzeichnis, was man sieht, wenn ein Ordner keine index.html Datei besitzt.
Wenn ich versuche, eine mp4-Datei herunterzuladen, wird sie aber im Browser abgespielt, anstatt heruntergeladen zu werden.
Wie kann ich mittels html und JavaScript alle Dateien des Ordners mit den Videos auflisten und Download Links generieren lassen?
btw: ich benutze nur
python -m http.server 1357
im entsprechenden Ordner, um den Webserver zu starten
2 Antworten
Du kannst zb Flask verwenden, und die Funktion send_file('Dateiname.mp4') verwenden.
ich benutze nur http.server um einen webserver zu erstellen
Wenn du schon einen Webserver für Python nutzt, würde ich auch die notwendige Serveranwendung mit Python entwickeln.
Zum Auflisten der Dateien kannst du das os-Modul einsetzen.
Ungefähr so:
files = {}
path = "folder path ..."
try:
entries = os.listdir(path)
except OSError:
# ...
else:
for entry in entries:
filename = os.path.join(path, entry)
if not os.path.isdir(filename):
files[entry] = filename
Einen Download kannst du zunächst über das download-Attribut triggern. In Flask / Jinja2 könnte das HTML dazu so gebaut werden:
{% if len(files) %}
<ul>
{% for file in files %}
<li><a download="{{ file }}" href="{{ files[file] }}">{{ file }}</a></li>
{% endfor %}
</ul>
{% endif %}
Oder du verweist mit dem Link auf einen Controller / Request Handler, der die Datei im Response übermittelt. Im Querystring der URL könnte der Name der Datei übertragen werden, die heruntergeladen werden soll. Verarbeite diesen Wert jedoch nicht blind. Lege all deine herunterladbaren Daten in einem separaten Ordner ab und achte darauf, auch nur aus diesem Ordner Daten herauszugeben.
Ein Beispiel für so eine Handler-Methode in Flask:
@app.route("/mp4download")
def download_mp4_file(filename):
if (is_valid_download_source(filename)):
return send_file(filename, as_attachment=True)
return ("", 204)
Die is_valid_download_source-Methode wäre hierbei eine Helferfunktion, die noch implementiert werden müsste.
Flask ist ein eigenes Framework mit einem eigenen integrierten Webserver.
Für eine Lösung nur mit dem http.server-Modul müsstest du dir einen Request Handler implementieren und registrieren (lies dazu in der Dokumentation).
In do_GET könntest du schauen, ob eine bestimmte URL aufgerufen wurde und wenn ja, einen entsprechenden Response zusammenbasteln.
Als erster Ansatz:
class DownloadRequestHandler(SimpleHTTPRequestHandler):
def do_GET(self):
if re.search(r"/mp4download", self.path):
filename = # read filename from URL querystring
self.send_response(200)
self.send_header("Content-Type: application/octet-stream")
self.send_header("Content-Disposition: attachment; filename=\"" + filename + "\"");
self.end_headers()
with open(directory_path + "/" + filename, "rb") as file:
self.wfile.write(file.read())
else:
SimpleHTTPRequestHandler.do_GET(self)
wie kann ich dass einbauen, im moment benutze ich nur http.server um einen webserver zu erstellen