我目前正在使用DuckDuckGo图标实用程序来获取某些网页的图标,尽管为了获取一个图标,它要求您在请求的末尾添加".ico“,例如:https://icons.duckduckgo.com/ip2/www.google.com.ico
所以,我使用一个WebClient来下载这个图标,但是,它似乎并没有完全下载它,因为每次我打开这个文件时,它都会出现损坏,并抛出一个错误,说明“无法读取文件头”。
到目前为止,我已经尝试了以下方法(我的WebClient称为client,要设置的图标称为favicon,图标文件的路径称为favicon_path):
Uri favicon_url = new Uri(
"https://icons.duckduckgo.com/ip2/" + gBrowser.Url.Host.ToString() + ".ico");
client.DownloadFile(@favicon_url, favicon_path);
favicon = new Icon(favicon_path);和
Uri favicon_url = new Uri("https://icons.duckduckgo.com/ip2/"
+ gBrowser.Url.Host.ToString().Replace(".", "%2E") + ".ico");
client.DownloadFile(@favicon_url, favicon_path);
favicon = new Icon(favicon_path);我猜想favicon_url中的多个句点(Favicon_url)是负责的,所以我的问题是:如果它的名称中有多个句点,我如何使用WebClient (或类似的东西)下载该图标?或者如果不是句点,为什么我不能读取从DuckDuckGo下载的文件?
发布于 2017-06-17 07:24:05
好的,下面是您需要做的事情(在调用DownloadFile()之后):
using (Stream inputStream = File.OpenRead(favicon_path))
using (Stream gzipStream = new GZipStream(inputStream, CompressionMode.Decompress))
{
MemoryStream copyStream = new MemoryStream();
gzipStream.CopyTo(copyStream);
copyStream.Position = 0;
favicon = new Icon(copyStream);
}我注意到下载的文件比实际的.ico文件要小得多。这意味着数据被压缩了。gzip是事实上的跨平台流压缩格式,因此我猜测并尝试将数据解压缩,就好像它是用Gzip压缩的一样。果然,是的。
请注意,您需要首先将数据解压缩到中间缓冲区(我使用了MemoryStream对象)。Icon构造函数将试图查找流,这在GzipStream对象中是不受支持的(原因很明显)。因此,您需要将数据解压缩到一个可查找的Stream对象中。
还请注意,还有一种使用HttpWebRequest的替代解决方案,它确实支持下载期间的解压缩。这不是使用WebClient.DownloadFile(),而不是像上面的另一个例子那样。
您仍然必须先复制到中间缓冲区(同样,因为Icon想要查找源流,这是不可见的)。但是,这种方法允许将数据直接从远程服务器读取到Icon对象,而不需要中间文件:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(favicon_url);
// You can also include `DecompressionMethods.Deflate` here, for a more general solution
request.AutomaticDecompression = DecompressionMethods.GZip;
MemoryStream copyStream = new MemoryStream();
request.GetResponse().GetResponseStream().CopyTo(copyStream);
copyStream.Position = 0;
favicon = new Icon(copyStream);https://stackoverflow.com/questions/44601463
复制相似问题