Nicht-Bild-Mediendateien, die sich im lokalen Speicher befinden oder mithilfe von rake uploads:migrate_to_s3 nach S3 migriert wurden, werden beim Klicken auf den Upload-Link mit dem ursprünglichen Dateinamen heruntergeladen. Nicht-Bild-Mediendateien, die direkt nach S3 hochgeladen werden, hingegen werden in einem neuen Tab geöffnet, wobei der ursprüngliche Dateiname verloren geht.
rake uploads:migrate_to_s3 setzt content_disposition für alle Nicht-Bild-Uploads
während das Hochladen nach S3 content_disposition nur für alle Nicht-Medien-Uploads setzt
Die Lösung besteht darin, is_supported_media durch is_supported_image zu ersetzen (getestet und funktioniert wie erwartet).
Ich denke, diese Korrektur klingt richtig – lass mich deine vorgeschlagenen Änderungen lokal testen, und wenn alles in Ordnung aussieht, werde ich einen PR erstellen.
Wenn ich mir das noch einmal ansehe, denke ich, dass die Lösung genau umgekehrt ist – die Aufgabe uploads:migrate_to_s3 sollte if !FileHelper.is_supported_media?(name) lauten. Es ergibt keinen Sinn, bei Videos und Audiodateien den Header content-disposition: attachment; filename=X zu setzen. Diese Dateien werden doch innerhalb eines Discourse-Beitrags gestreamt, nicht heruntergeladen, oder?
Also wäre das gewünschte Verhalten:
Kein Header content-disposition: attachment
Bilder
Videos
Audiodateien
Header content-disposition: attachment mit Originaldateiname
Alle anderen Anhänge/Uploads (PDF, TXT, CSV usw.)
Falls ich etwas übersehe, fügen Sie gerne weitere Informationen oder Beispiele hinzu.
Glaub mir, ich habe Tage damit verbracht, das herauszufinden, und es kam mir auch seltsam vor. Aber das Setzen von content-disposition: attachment; filename=X für alle Mediendateien außer Bildern imitiert perfekt, wie Mediendateien derzeit aus dem lokalen Speicher bereitgestellt werden.
Kurz gesagt: NEIN! Ich kann sie bei Bedarf über Oneboxing streamen, aber der direkte Download-Link [media_file](path_to_media_file) – wobei der Pfad entweder lokal oder S3 ist – sollte die Datei mit ihrem Originaldateinamen herunterladen, genau wie bei lokaler Speicherung (und für Dateien, die zu S3 migriert wurden).
Dies ist jedoch plötzlich für direkte Uploads zu S3 nicht mehr möglich: Der Link [media_file](S3_path_to_media_file) streamt die Mediendatei in einem neuen Tab (nicht erforderlich, da dies genau das ist, was Oneboxing tut), und beim Versuch, sie über die Steuerelemente des Media-Players herunterzuladen, geht auch der Originaldateiname verloren.
Ich erwarte, dass Dateien, die lokal und auf S3 gehostet werden, sich gleich verhalten, oder? Mit deinem Vorschlag würde die Funktionalität für auf S3 gehostete Uploads vollständig umgekehrt werden, nicht nur für neue, sondern auch für migrierte Dateien.
Hier ist ein detaillierter Fallbericht, und warum ich glaube, dass mein Vorschlag korrekt ist (d. h. er behält die gleiche Funktionalität für Uploads bei, die sowohl lokal als auch auf S3 gehostet werden):
Lokal gehostete Dateien
Ich habe ein großes Repository mit über 5.000 Audiodateien (Sprache) im Bereich von 1–10 MB, mit einer Gesamtgröße von ca. 40 GB, die derzeit im lokalen Speicher gehostet werden und nun zu S3 übertragen werden (dies ist beabsichtigt, ich möchte nicht, dass sie bei einem Drittanbieter gehostet werden). Dies funktioniert bereits aus Leistungssicht ziemlich gut, aber aufgrund der steigenden Speicherkosten und der Möglichkeit, ein CDN mit S3 zu nutzen, macht es nun Sinn, auf S3 zu migrieren.
Diese Dateien sind auf Größe optimiert und sollen nicht gestreamt, sondern heruntergeladen und lokal angehört werden (für Clients mit begrenzter Bandbreite/Konnektivität). Dateien werden im Bulk-Verfahren hochgeladen und dann in rohen Beiträgen über Links referenziert, die aus ihren jeweiligen SHA1-Werten generiert werden: [dl_link](https://discourse.forum.tld/uploads/default/original/3X/0/1/0123..sha1.mp3), und können durch Klicken auf den direkten Link zur Datei mit ihrem Originaldateinamen heruntergeladen werden (siehe Beispiel hier).
Wenn diese Links hingegen geoneboxed wären, könnten sie direkt vom Discourse-Server gestreamt werden (und ebenfalls über die Player-Steuerelemente heruntergeladen werden, wiederum mit dem Originaldateinamen).
Zu S3 migrierte Dateien
Wenn Uploads mit uploads:migrate_to_s3 vom lokalen Speicher zu S3 migriert werden, passieren zwei Dinge:
content-disposition: attachment; filename=X wird für alle Uploads außer Bildern gesetzt.
Direkte lokale Links [dl_link](https://discourse.forum.tld/uploads/default/original/3X/0/1/0123..sha1.mp3) in rohen Beiträgen werden durch S3-Links [dl_link](https://cdn_url/uploads/original/3X/0/1/0123..sha1.mp3) ersetzt.
Dies imitiert lokal gehostete Uploads in jeder Hinsicht (Download-Links mit Originaldateinamen sowie Oneboxing).
Neu zu S3 hochgeladene Dateien
content-disposition: attachment; filename=X wird nicht für alle Mediendateien gesetzt.
Neu hochgeladene Dateien werden in rohen Beiträgen über eine Short-URL referenziert, aber die gekochten Links zeigen immer noch direkt auf https://cdn_url/uploads/original/3X/0/1/0123..sha1.mp3.
Das Klicken auf den Short-URL-Link oder den manuell eingefügten S3-Link [dl_link](https://cdn_url/uploads/original/3X/0/1/0123..sha1.mp3) öffnet die Datei in einem neuen Tab, anstatt sie herunterzuladen.
Da content-disposition nicht gesetzt ist, unterscheidet sich dies nun von der Art und Weise, wie Mediendateien aus dem lokalen Speicher bereitgestellt werden (Oneboxing funktioniert weiterhin, aber Download-Links mit Originaldateinamen sind nicht mehr verfügbar).
Wenn du weitere Informationen benötigst, lass es mich bitte wissen.
Um ehrlich zu sein, habe ich mich aufgrund anderer dringender Arbeiten bisher nicht weiter damit befasst. Ich habe mir jetzt etwas Zeit in meinem Kalender freigemacht, um diese Woche einen gründlichen Blick darauf zu werfen. Die Änderung scheint geringfügig zu sein, daher sollte es nicht lange dauern. Ich melde mich, sobald der PR abgeschlossen ist.
@md-misko Ich habe deinen Use Case bestätigt, und nachdem ich den Content-Disposition-Header korrigiert habe, kann ich Audio und Video weiterhin korrekt streamen. Der Fix wird derzeit gebaut und sollte bis Ende des Tages gemerged werden: