MP4 Datei Download lokaler webserver?


01.05.2022, 17:38

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

0

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.

wie kann ich dass einbauen, im moment benutze ich nur http.server um einen webserver zu erstellen

0
@Blincx

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)
1