노드

2014-10-21 2 views
2

이있는 .ttf 파일을 다운로드합니다. .ttf 파일 (노드를 사용하여 this one)을 다운로드하려고합니다.노드

나는 HTTP 요청을 처리하기 위해 mikeal/request을 사용하고 있습니다. 예상대로 정확히 행동, 빠른 눈 후

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

; 실제 기능은 다음과 같이 보입니다 모든 것이 올바른 장소에서 끝나고 더 많거나 적은 것처럼 보입니다.

그러나 다음 @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하고 동일한 작업을 수행하여이 오류를 확인했습니다. 미리보기에로드되었습니다.

이렇게하면 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 

빠른 검사와 확인, 나는이

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

모든 것이 잘 어울려 할 수있는 밝혀, 노드 버전은 올바른 인코딩으로 게재되었다. 그러나 여전히 브라우저에서 똑같은 문제가 있습니다. 크롬의 나의 버전은 .TTF 글꼴 얼굴을 지원하는 것을 확인했다

(버전 37.0.2062.94 (64 비트). 그것은 않습니다.)

는 지금까지 내가 볼 수있는 바와 같이, 파일은 이제 동일 하였다. Diff는 특히 도움이되지 않았습니다.

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

diff를 바이너리 파일과 함께 사용하는 것이 더 현명한 방법 일 수 있습니다. 두려워, 나는 그것에 대해 충분히 알지 못한다. 나는 원시적 인 수동 비교를 위해 가기로 결정했다.

Hex View

나는 정력을 해고 화면에 두 파일을 가지고와 봐보기 위해 16 진수 모드로 노크. 애플, 마이크로 소프트, 어도비는 모두 TTF 파일에 대해 다른 사양을 갖고있는 것 같아요.이 스펙이 어떤 스펙을 고수하는지 확실하지 않지만, 첫 번째 바이트 행은 일반적인 헤더의 일부라고 생각합니다.

바이트의 맨 위 행 뒤에 파일의 나머지 부분이 다릅니다.

여기 지구상에서 무슨 일이 일어나고 있습니까? Node는 wget과 다른 파일로 어떻게 끝나나요?

  • 둘 중 유틸리티가 제공된 파일에 영향을 미치는 이상한 헤더를 전달합니까?
  • 이것이 writeFile을 사용하는 방식에 문제가 될 수 있습니까?

나는 분명히 뭔가를 놓쳤습니다. 그렇지 않으면 제안을 환영 할 것입니다.

답변

2

encodingnull으로 설정하여 이진 인코딩을 지정하도록 지정해야합니다.

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

그렇지 않은 경우 기본값은 UTF-8 인코딩입니다. 문서 : https://github.com/mikeal/request

정말 그래도 파일을 효율적으로 스트리밍해야합니다.

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