我正在使用Background Tranfer API下载内容。所以我的查询非常简单,如何获取HTML或MP4等文件类型。
答案 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.BackgroundTransfer.ResponseInformation
对象获取Content-Type
标头,而不是IHttpContent
。例如:
private async Task HandleDownloadAsync(DownloadOperation download, bool start)
{
...
ResponseInformation response = download.GetResponseInformation();
var contenttype = response.Headers["Content-Type"];
}
我们列出了有关下载Uri的三个方案,但我们不确定您是否有其他方案可以采用其他方式来处理它们。
Content-Type
和文件后缀,因此无法保证文件扩展名的结果。