使用Node下载.ttf文件

我试图用Node来下载一个.ttf文件。

我正在使用mikeal /请求来处理HTTP请求。 实际的function看起来像这样:

request.get(url, function(err, res, body) { if(err) throw err; fs.writeFileSync(path, body); }); 

匆匆一瞥后,它的行为完全如预期; 一切都结束在正确的地方,它看起来或多或less是正确的。

但是,当我尝试使用以下@font-face片段将字体加载到浏览器中时,该规则已应用,但字体不是。 没有错误,没有加载失败或被覆盖。

 @font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 400; src: local('Open Sans'), local('OpenSans'), url(cJZKeOuBrn4kERxqtaUH3aCWcynf_cDxXwCLxiixG1c.ttf) format('truetype'); } 

对于初步检查,我试图用KFontView打开它,但遇到了“无法读取字体”错误。

我通过wgeting一个新的文件的副本来validation这个错误,并做同样的事情。 它加载到预览罚款。

这慢跑了我的记忆关于一个可以传递给writeFile的可选参数,所以我检查了wget版本和节点版本的编码。

 $ enca wget.ttf -L none > Unrecognized Encoding $ enca node.ttf -L none > Universal transformation format 8 bits; UTF-8 > Mixed line terminators > Surrounded by/intermixed with non-text data 

所以,相当明显。 wget将其保存为二进制文件,而节点将其写入文件为UTF-8。 Quicky用一个file确认

 $ file -i wget.ttf > wget.ttf: application/x-font-ttf; charset=binary 

快速扫描节点文档,事实certificate我可以做到这一点

 fs.writeFileSync(path, body, 'binary'); 

一切看起来不错,节点版本现在显示为正确的编码。 但是,在浏览器中仍然存在完全相同的问题。

确保我的Chrome版本支持.ttf font-faces(版本37.0.2062.94(64位)。)。

据我所知,文件现在是相同的。 差别是特别无益的。

 $ diff wget.ttf node.ttf > Binary files wget.ttf and node.ttf differ. 

在二进制文件中使用diff可能更合理。 害怕,我对此不够了解。 我决定去一个原始的手动差异。

十六进制视图

我激发了vim,在屏幕上获得了两个文件,并敲入hex模式来看看。 苹果,微软和Adobe似乎都有不同规格的TTF文件,我不确定这个规格是什么,但是我猜测第一行字节是通用标题的一部分。

在第一行字节之后,文件的其余部分是不同的。

这里究竟发生了什么? 节点如何以不同的文件结束wget?

  • 两个实用程序是否会传递任何会影响所提供文件的奇怪标题?
  • 这可能是我使用writeFile的方式的一个问题?

我希望我已经错过了一些明显的东西。 否则,任何build议将受到欢迎。

您需要通过将encoding设置为null来指定您需要二进制编码。

 request.get({ url: url, encoding: null, }, function (err, res, body) { 

否则,它将默认为UTF-8编码。 文档: https : //github.com/mikeal/request

实际上,你应该让它stream到一个文件为你,为了效率。

 request('http://example.com/font.ttf').pipe(fs.createWriteStream('font.ttf'));