问题:
使用request模块下载文件,并写入文件系统与使用浏览器直接下载不同
我正在获取位于 https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff
的字体文件.有以下3种情况。
案例一
现在当正常情况下网站从其源代码运行这个 URL 时,以下是响应 [在开发者工具中检查]
d09GRgABAAAAAPqMABMAAAACNCgAAQAyAAAAAAAAAAAAAAAAAAAAAAAAAABCQVN....
当我使用我的 nodejs 脚本获取它时,我得到了响应
wOFF....??....4(...2....
以上是我在浏览器的开发者工具网络选项卡中看到的响应。
案例二
但是当我同时运行两个网址时,即原始网址和我自己的网址 http://<host>/_oe/https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff
,在 Postman 中,我得到了相同的响应。
案例三
然后再复制和粘贴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...
最佳答案
要获取响应的原始缓冲区,您需要将 encoding
设置为 null
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) {
})
})
然后这将等于您请求的那个。
关于javascript - 无法使用 nodejs 获取、写入和读取字体文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50921300/