【发布时间】:2017-06-17 06:17:18
【问题描述】:
我目前正在使用 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(或类似的东西)下载 favicon如果它的名称中有多个句点?或者如果不是句号,为什么我不能读取从 DuckDuckGo 下载的文件?
【问题讨论】:
-
“我猜测 favicon_url 中的多个句点 (.) 是有原因的” ——这听起来对我来说是一个非常糟糕的猜测。 URL 有效或无效。如果不是,您将在 HTTP 请求上收到错误,而不是无效数据。我认为更大的问题可能是网站不使用实际的 Windows 图标文件作为其图标。它们实际上是位图,需要按原样读取。您似乎正在尝试将下载的文件传递给
Icon构造函数,但我怀疑该文件实际上是一个有效的 .ico 文件(尽管网站让您使用扩展名)。 -
多个句点应该不是问题。能否在记事本等文本编辑器中打开下载的文件,确认是否是正在保存的二进制文件?可能是正在保存的 HTML 错误页面。
-
favicon_url.ToString()返回什么?如果您使用https://icons.duckduckgo.com/ip2/www.google.com.ico进行测试,代码是否有效? -
好吧,我对它是否是有效的 .ico 文件的问题进行了纠正(通过我自己对数据的检查)。这是。但我仍然认为下载问题与时期无关。您正在以其他方式破坏数据。
-
"gBrowser" 是一个 Web 浏览器控件,因此它只是获取 Web 浏览器控件中加载的 URL 的主机。 “icons.duckduckgo.com/ip2”总是返回一个图标文件,它在获取网站的图标(包括在必要时将其转换为图标)方面完成所有繁重的工作。 @mjwills 即使使用建议的 URL 进行测试,代码也不起作用。