如何在不知道文件类型或文件名的情况下下载文件?

3

我有一个类似于这样的下载链接:

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

下载结果可能是任何文件类型的文件,例如Picture.jpgsomething.pdf。如何能够下载这个链接后面的任何文件,并保留原始名称和扩展名?

1
对我来说,直接使用Client.DownloadFile("http://example.com/file/song/a.mpeg", "a.mpeg")是不可能的。因为我不知道"/a.mpeg"是什么意思。 - DerHelm
3
@Sakis 绝对不是一份重复内容。 - Paul Kertscher
1个回答

5

通过HTTP协议,不仅可以传输有效负载数据,还可以使用头部来传输元数据。在接收端,您可以使用该数据来确定存储文件的名称。

为了确定文件类型,HTTP响应必须具有正确的Content-Type头(请参见此处)。如果传输的文件是PDF,则HTTP响应将具有标题字段。

Content-Type: application/pdf

此外,如果Disposition设置为“attachment”(即可下载文件而非内联内容),则可以在Content-Disposition头中传递文件名(请参见此处)。
Content-Disposition: attachment; filename="something.pdf"

如果已知Content-Type,但没有文件名,则您可以使用默认文件名和与Content-Type匹配的扩展名,例如download.pdf。如果缺少或通用Content-Type,则运气不佳。您可以尝试获取文件内容,但对于某些文件类型来说,这可能成功或不可靠。

由于这是一个C#问题

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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接