首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从.ico下载DuckDuckGo文件

从.ico下载DuckDuckGo文件
EN

Stack Overflow用户
提问于 2017-06-17 06:17:18
回答 1查看 1.1K关注 0票数 3

我目前正在使用DuckDuckGo图标实用程序来获取某些网页的图标,尽管为了获取一个图标,它要求您在请求的末尾添加".ico“,例如:https://icons.duckduckgo.com/ip2/www.google.com.ico

所以,我使用一个WebClient来下载这个图标,但是,它似乎并没有完全下载它,因为每次我打开这个文件时,它都会出现损坏,并抛出一个错误,说明“无法读取文件头”。

到目前为止,我已经尝试了以下方法(我的WebClient称为client,要设置的图标称为favicon,图标文件的路径称为favicon_path):

代码语言:javascript
复制
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);

代码语言:javascript
复制
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下载的文件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-17 07:24:05

好的,下面是您需要做的事情(在调用DownloadFile()之后):

代码语言:javascript
复制
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对象,而不需要中间文件:

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44601463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档