如何获取下载的文件类型?

时间:2017-06-27 13:07:24

标签: c# xaml uwp windows-10

我正在使用Background Tranfer API下载内容。所以我的查询非常简单,如何获取HTML或MP4等文件类型。

1 个答案:

答案 0 :(得分:2)

抛开后台传输API,我认为你应该知道的第一个问题是“如何从下载Uri获取文件扩展名”。

为此,我们需要考虑几个关于“Uri”的场景。

  • 下载后的Uri确实有一个文件扩展名,例如: https://code.msdn.microsoft.com/windowsapps/Background-File-Downloader-a9946bc9/file/145559/1/BackgroundDownloader.zip。在这种情况下,我们可以使用Path.GetExtension方法直接获取文件扩展名。

  • 下载Uri有一个文件扩展名,但后面还有查询参数,例如:https://i.stack.imgur.com/7e3M5.jpg?s=328&g=1。在这种情况下,在通过Path.GetExtension获得扩展后,我们需要通过获取子字符串或其他表达式来获取实际扩展。

  • 下载Uri不包含文件 延期。例如, https://channel9.msdn.com/Events/Build/2017/T6056/captions?f=webvtt&l=en。 在这种情况下,通常我们可以从内容类型中获取MIME类型 http响应内容头,然后映射相应的 文件扩展名。

这是我在我身边测试的一个非常简单的演示,用于获取上述Uri的文件扩展名:

private async void btnuri_Click(object sender, RoutedEventArgs e)
{
    string ext;
    ext = await GetFileExtention("https://i.stack.imgur.com/7e3M5.jpg?s=328&g=1");
    System.Diagnostics.Debug.WriteLine(ext);
    ext = await GetFileExtention("https://channel9.msdn.com/Events/Build/2017/T6056/captions?f=webvtt&l=en");
    System.Diagnostics.Debug.WriteLine(ext);
    ext = await GetFileExtention("https://code.msdn.microsoft.com/windowsapps/Background-File-Downloader-a9946bc9/file/145559/1/BackgroundDownloader.zip");
    System.Diagnostics.Debug.WriteLine(ext); 
}

public async Task<String> GetFileExtention(string url)
{
    string ext = "";
    try
    {
        if (Path.HasExtension(url))
        {
            ext = Path.GetExtension(url);
            ext = ext.Contains('?') || ext.Contains('=') ? ext.Substring(0, ext.LastIndexOf("?")) : ext;
        }
        else
        {
            HttpClient client = new HttpClient();
            HttpResponseMessage response = await client.GetAsync(new Uri(url));
            IHttpContent res = response.Content;
            string ContentType = res.Headers["Content-Type"];
            string MimeType = ContentType.Substring(0, ContentType.LastIndexOf(";"));
            switch (MimeType)
            {
                case "text/plain":
                    ext = ".txt"; break;
                case "text/vtt":
                    ext = ".vtt"; break;      
                case "text/html":
                    ext = "html"; break;
                default:
                    ext = ".unknown"; break;
            }
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.ToString());
    }
    return ext;
}

我们需要注意一下演示:

  • 如果您使用的是background transfer,则需要从Windows.​Networking.​Background​Transfer.Response​Information对象获取Content-Type标头,而不是IHttpContent。例如:

    private async Task HandleDownloadAsync(DownloadOperation download, bool start)
    {
      ... 
      ResponseInformation response = download.GetResponseInformation();
      var contenttype = response.Headers["Content-Type"]; 
    }
    
  • 我们列出了有关下载Uri的三个方案,但我们不确定您是否有其他方案可以采用其他方式来处理它们。

  • 由于服务器提供Content-Type和文件后缀,因此无法保证文件扩展名的结果。
  • 我们没有列出所有MIME类型映射,上面仅用于简单测试。有关更多详细信息和更多MIME类型映射,您可以参考this threadthis package