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

Der*_*elm 3 c# file-type download

我有这样的下载链接:

https://someURL.com/PiPki.aspx?ident=594907&jezik=de
Run Code Online (Sandbox Code Playgroud)

下载结果可以是具有任何文件类型的文件.例如Picture.jpgsomething.pdf.如何以原始名称和扩展名下载此链接背后的文件怎么样?

Pau*_*her 5

通过HTTP,不仅可以传输有效载荷数据,而且还有一个可用于传输元数据的头.在接收方,您可以使用该数据,例如,确定将文件存储为的名称.

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

Content-Type: application/pdf
Run Code Online (Sandbox Code Playgroud)

此外,还有一个在传递一个文件名的可能性Content-Disposition头(见这里)如果配置设置为attachment(即下载的文件,而不是在线内容)

Content-Disposition: attachment; filename="something.pdf"
Run Code Online (Sandbox Code Playgroud)

如果有一个已知的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);
    }
}
Run Code Online (Sandbox Code Playgroud)