gpt4 book ai didi

c# - 从 DuckDuckGo 下载 .ico 文件

转载 作者:太空宇宙 更新时间:2023-11-03 12:26:36 26 4
gpt4 key购买 nike

我目前正在使用 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 中的多个句点 ('.') 造成的,所以我的问题是:如何使用 WebClient (或类似的东西)如果它的名称中有多个句点?或者,如果不是句点,为什么我无法读取从 DuckDuckGo 下载的文件?

最佳答案

好的,这是您需要做的(在调用 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);

关于c# - 从 DuckDuckGo 下载 .ico 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44601463/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com