2

问题

使用request模块下载的文件,写入文件系统与使用浏览器直接下载的文件不同

我正在获取位于的字体文件https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff。有以下3种情况。

情况1

现在,当网站通常从其源代码运行此 URL 时,以下是响应 [在开发人员工具中检查]

d09GRgABAAAAAPqMABAAAACNCgAAQAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCQVN....

当我使用我的 nodejs 脚本获取它时,我得到了响应

wOFF....??....4(...2....

以上是我在浏览器的开发者工具网络选项卡中看到的响应。

案例2

但是,当我在 Postman 中同时运行 url 即原始和我自己的 url 时http://<host>/_oe/https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff,我得到了相同的响应。

案例3

然后再次复制并粘贴https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff到浏览器中时,下载的文件看起来像

774f 4646 0001 0000 0000 c7f4 000b 0000 0000 c7a8 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 4f53 2f32

并且使用我的 nodejs 脚本编写的文件看起来像

774f 4646 0001 0000 0000 efbf bdef bfbd 000b 0000 0000 c7a8 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

两者又不同了。

问题

我的问题是,任何人都可以解释这里发生了什么,我做错了什么,以及我可以做些什么来获得具有正确编码的正确字体文件,以便在前端正确使用它。

Nodejs 脚本:这是我的 nodejs 代码

app.get('/*', (req, res) => {
    var extension = '.woff';
    var options         = {
        headers: {
            'connection': 'keep-alive',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',
            'Accept-Language': 'en-US,en;q=0.5'
        },
        url: 'https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff'
    };

    sendRequest(options, extension, function(headers){

        //setting response headers
        var header_ = {};
        for(var attribute in  headers){
            if(attribute !== 'content-length'){
                header_[attribute] = headers[attribute];
            }
        }

        //#================================================================
        res.writeHead(200, header_);
        var filePath = path.join(__dirname, 'output/temp'+extension);
            var stat = fileSystem.statSync(filePath);
            var readStream = fileSystem.createReadStream(filePath);
            //read from `readStream` write to `res`
            readStream.pipe(res);
        //#================================================================

    });

})

async function sendRequest(options, extension, callback){
    var headers;
    request(options, function(error, response, body){
        if (!error && response.statusCode == 200) {
            headers = response.headers;

            if (String(response.headers['content-type']).indexOf('text/html') !== -1){
                // any manipulation related to the html file                
            }else {
                // where I get my font url response
                fileSystem.writeFile(path.join(__dirname, 'output/temp'+extension), body, function(err) {
                    if(err) {
                        return console.log(err);
                    }
                    callback(headers);
                }); 
            }
        }
    });
}

app.listen(3000, () => console.log('Example app listening on port 3000!'));

更新

我什至在写文件时使用了“二进制”选项,即

fileSystem.writeFile(path.join(__dirname, 'output/temp'+extension), body, "binary", function(err) {})

现在在控制台上我得到所需格式的数据 d09GRgABAAAAAP39AAs...

但仍然与我从原始网站获得的不同,即 d09GRgABAAAAAPqMABMAAAACNC...

4

1 回答 1

2

要获取响应的原始缓冲区,您需要设置encodingnull

var options = {
    url: 'https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff',
    encoding : null
};

如果您随后将其写入文件:

request(options, function(error, response, body) {
    fs.writeFile('test.woff', body, function(err) {

    })
})

那么这将与您要求的相同。

于 2018-06-19T06:32:36.353 回答