.NET WebClient.DownloadData获取文件类型?

时间:2014-06-12 06:00:23

标签: c# asp.net .net file webclient

为了处理从没有文件扩展名的网址下载数据的情况, 我需要知道文件类型是什么。

例如,WebClient.DownloadData方法如何使用下面的url显示它下载了一个png [edit:jpeg]图像?

https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcTw4P3HxyHR8wumE3lY3TOlGworijj2U2DawhY9wnmcPKnbmGHg

我在documentation中没有找到描述如何执行此操作的任何内容。

4 个答案:

答案 0 :(得分:6)

如果您信任标题信息,可以使用names = strings(0); for i=1:10 names(end+1) = 'string'; end 进行操作 - 您不需要使用WebClient

HttpClient

答案 1 :(得分:3)

它不能直接。

如果您信任Web服务器发回的标头,您可以使用其他HTTP客户端(例如WebRequestHttpClient)来使整个响应可用而不仅仅是正文。然后,您可以查看Content-Type标题。

除此之外,您还需要查看内容本身。各种文件类型都有"幻数"您可以使用它来识别文件 - 它们通常位于文件的开头,如果您只有一组有限的文件类型需要查找,这可能是一种可行的方法。它虽然无法识别所有文件类型。

例如,您链接的图像的前四个字节是ff d8 ff e0。这表明它实际上不是jpeg图像。碰巧,服务器响应包含content-type: image/jpeg的标题。

答案 2 :(得分:3)

您可以使用 HttpClient 来执行此GET请求。

  

示例代码:

            HttpClient client = new HttpClient();
            var response = await client.GetAsync("https://encrypted-tbn2.gstatic.com/images?q=tbn%3aANd9GcTw4P3HxyHR8wumE3lY3TOlGworijj2U2DawhY9wnmcPKnbmGHg");
            var filetype = response.Content.Headers.ContentType.MediaType;
            var imageArray = await response.Content.ReadAsByteArrayAsync();

在上面的代码中,filetype变量具有文件类型,并且扩展名为image / JPEG或image / PNG等。

答案 3 :(得分:1)

您可以尝试使用FindMimeFromData API。这是片段。它可能对你有帮助。

WebClient webClient = new WebClient();
var result = webClient.DownloadData(new Uri("url"));
IntPtr mimeout;
int result2 = FindMimeFromData(IntPtr.Zero, "sample", result, 4096, null, 0, out mimeout, 0);
if (result2 != 0)
    throw Marshal.GetExceptionForHR(result2);
string mime = Marshal.PtrToStringUni(mimeout);
Marshal.FreeCoTaskMem(mimeout);
Console.WriteLine(mime);

这是API声明。 (从here复制)

[DllImport("urlmon.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = false)]
static extern int FindMimeFromData(IntPtr pBC, [MarshalAs(UnmanagedType.LPWStr)] string pwzUrl, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1, SizeParamIndex = 3)] 
byte[] pBuffer, int cbSize, [MarshalAs(UnmanagedType.LPWStr)]  string pwzMimeProposed, int dwMimeFlags, out IntPtr ppwzMimeOut, int dwReserved);