为了处理从没有文件扩展名的网址下载数据的情况, 我需要知道文件类型是什么。
例如,WebClient.DownloadData方法如何使用下面的url显示它下载了一个png [edit:jpeg]图像?
我在documentation中没有找到描述如何执行此操作的任何内容。
答案 0 :(得分:6)
如果您信任标题信息,可以使用names = strings(0);
for i=1:10
names(end+1) = 'string';
end
进行操作 - 您不需要使用WebClient
:
HttpClient
答案 1 :(得分:3)
它不能直接。
如果您信任Web服务器发回的标头,您可以使用其他HTTP客户端(例如WebRequest
或HttpClient
)来使整个响应可用而不仅仅是正文。然后,您可以查看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);