我正在使用后台传输 API 来下载东西。所以我的查询非常简单,如何获取 HTML 或 MP4 等文件类型。
撇开后台传输 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
。在这种情况下,一般我们可以从http响应内容头的内容类型中获取MIME类型,然后映射对应的文件扩展名。
这是我在我这边测试的一个非常简单的演示,用于获取上述文件扩展名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;
}
关于demo我们需要注意的一点:
如果您使用的是后台传输,则需要Content-Type
从Windows.Networking.BackgroundTransfer.ResponseInformation
对象中获取标头,而不是IHttpContent
. 例如:
private async Task HandleDownloadAsync(DownloadOperation download, bool start)
{
...
ResponseInformation response = download.GetResponseInformation();
var contenttype = response.Headers["Content-Type"];
}
我们列出了三个关于下载 Uri 的场景,但我们不确定您是否还有其他场景,您应该有其他方法来处理它们。
Content-Type
和 文件后缀由服务器提供,因此无法保证文件扩展名的结果。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句