Wie lade ich eine Datei herunter, ohne den Typ oder Dateinamen zu kennen?


DerHelm

Ich habe einen Download-Link wie diesen:

https://someURL.com/PiPki.aspx?ident=594907&jezik=de

Das Download-Ergebnis kann eine Datei mit einem beliebigen Dateityp sein. Zum Beispiel Picture.jpgoder something.pdf. Wie ist es möglich, die hinter diesem Link stehende Datei mit ihrem ursprünglichen Namen und ihrer ursprünglichen Erweiterung herunterzuladen?

Paul Kertscher

Über HTTP besteht nicht nur die Möglichkeit, Nutzdaten zu übertragen, sondern es gibt auch einen Header, mit dem Sie Metadaten übertragen können. Auf der Empfängerseite können Sie diese Daten verwenden, z. B. um den Namen zu bestimmen, unter dem die Datei gespeichert werden soll.

Um den Dateityp zu bestimmen, muss die HTTP-Antwort den richtigen Content-TypeHeader haben (siehe hier ). Wenn es sich bei der übertragenen Datei um eine PDF-Datei handelt, enthält die HTTP-Antwort das Header-Feld

Content-Type: application/pdf

Darüber hinaus besteht die Möglichkeit, einen Dateinamen im Content-DispositionHeader zu übergeben (siehe hier ), wenn die Disposition auf gesetzt ist attachment(dh eine herunterladbare Datei anstelle von Inline-Inhalten).

Content-Disposition: attachment; filename="something.pdf"

Wenn es ein bekannten ist Content-Type, aber kein Dateiname, würde Ihre Option sein , ein Standard - Dateinamen zu verwenden und die Erweiterung Anpassung der Content-Typezum Beispiel download.pdf. Wenn das Content-Typefehlt oder generisch ist, haben Sie Pech. Sie könnten versuchen, den Inhalt der Datei abzurufen, dies kann jedoch erfolgreich sein oder auch nicht und für bestimmte Dateitypen unzuverlässig sein.

Da dies eine C # -Frage ist

var client = new HttpClient();

using (var response = await client.GetAsync("https://someURL.com/PiPki.aspx?ident=594907&jezik=de"))
{
    string fileName = null;

    if (response.Headers.Contains("Content-Disposition"))
    {
        fileName = GetFileNameFromContentDisposition(response.Headers);
    }

    if (fileName == null && response.Headers.Contains("Content-Type"))
    {
        var extension = GetExtensionFromContentType(response.Headers);
        fileName = $"download.{extension}";
    }

    using (var fileStream = File.OpenWrite(fileName))
    {
        await response.Content.CopyToAsync(fileStream);
    }
}

Verwandte Artikel


Wie lade ich eine Datei mit Angular2 oder höher herunter?

rll: Ich habe eine WebApi / MVC-App, für die ich einen Angular2-Client entwickle (als Ersatz für MVC). Ich habe einige Probleme zu verstehen, wie Angular eine Datei speichert. Die Anfrage ist in Ordnung (funktioniert gut mit MVC und wir können die empfangenen

Wie lade ich eine Datei in Java herunter?

Kyle : Ich habe ein paar Byte while-Schleifenmethoden und diese Methode unten ausprobiert: try { URL dl = null; dl = new URL("http://ds-forums.com/kyle-tests/uploads/Screenshots.zip"); ReadableByteChannel rbc = Channels.newChannel(dl.openStream(

Wie lade ich eine Xcode DMG- oder XIP-Datei herunter?

Stolzes Mitglied Wo lädt der Mac App Store die Dateien unter Lion herunter? Ich benötige die DMG-Datei, um etwas in meinem System zu reparieren, aber wie kann ich auf diese Datei zugreifen? Hailei Sie finden die DMGs oder XIPs für Xcode und andere Entwicklungs

Aus einer Datei lesen, ohne den Typ zu kennen

Raver Ich versuche, meine erste Bibliothek zu erstellen, und dafür mache ich ein einfaches Schreiben / Lesen aus der Dateibibliothek. Im Moment habe ich den Code für die Speichermethoden: @NonNull public TexterRequest write(List<Object> data) { return writ