是否可以使用 XHR 或 fetch 下载二进制文件(pdf、word、excel、ppt、mp3,...)?
is binary file(pdf, word, excel, ppt, mp3,...) download possible using XHR or fetch?
是否可以使用 XHR 或 fetch 下载二进制文件(pdf、word、excel、ppt、mp3、...)?我已经看到一些使用数据 URI 和 base64 转换的 pdf 和图像的片段和技巧。我们有更好的机制可用吗?
我需要下载一个具有以下限制的文件:
- 文件下载请求必须使用 oauth2 令牌进行身份验证。本质上这意味着我需要将授权 header 设置为某个值
- 服务器returns 分块数据。需要加入块(或者我可以强制服务器发送 non-chunked 数据)
我的 NodeJS 代码
获取元数据
var options = {
hostname : API_HOST ,
method : 'GET',
port : 443,
path : API_PATH + fileId,
headers : {
'Authorization' : 'Bearer ' + GOOGLE_ACCESS_TOKEN
}
}
var meta = '';
var fileRequest = https.request(options, function(response) {
response.setEncoding('utf8');
response.on('data', function(chunk) {
meta += chunk;
});
response.on('end', function(error) {
callback(error, meta);
})
});
获取实际文件
var file = fs.createWriteStream(GDRIVE_ROOT + '\' + JSON.parse(meta).originalFilename);
var options = {
hostname : url.parse(JSON.parse(meta).downloadUrl).hostname,
method : 'GET',
port : 443,
path : url.parse(JSON.parse(meta).downloadUrl).path,
headers : {
'Authorization' : 'Bearer ' + GOOGLE_ACCESS_TOKEN
}
}
var request = https.request(options, function(response) {
response.pipe(file);
});
request.end();
我让它在 NodeJS 上工作。有没有办法让我在浏览器中实现文件下载。我在 http://jsfiddle.net/LdyruLwv/
有一段使用 fetch 的 non-working 代码
传输编码对于浏览器中的应用程序应该是透明的,不用担心。
下面是一个基本的 ajax 文件下载解决方案,它使用 XHR2、blob 和具有下载属性的锚点。
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if (this.readyState == 4 && this.status == 200){
var blobURL = window.URL.createObjectURL(this.response);
var anchor = document.createElement('a');
anchor.download = 'filename.ext';
anchor.href = blobUrl;
anchor.click();
}
}
xhr.open('GET', request_url);
xhr.setRequestHeader('Authorization', 'Bearer ' + GOOGLE_ACCESS_TOKEN);
xhr.responseType = 'blob'; // Get a binary response
xhr.send(jData);
是否可以使用 XHR 或 fetch 下载二进制文件(pdf、word、excel、ppt、mp3、...)?我已经看到一些使用数据 URI 和 base64 转换的 pdf 和图像的片段和技巧。我们有更好的机制可用吗?
我需要下载一个具有以下限制的文件:
- 文件下载请求必须使用 oauth2 令牌进行身份验证。本质上这意味着我需要将授权 header 设置为某个值
- 服务器returns 分块数据。需要加入块(或者我可以强制服务器发送 non-chunked 数据)
我的 NodeJS 代码
获取元数据
var options = {
hostname : API_HOST ,
method : 'GET',
port : 443,
path : API_PATH + fileId,
headers : {
'Authorization' : 'Bearer ' + GOOGLE_ACCESS_TOKEN
}
}
var meta = '';
var fileRequest = https.request(options, function(response) {
response.setEncoding('utf8');
response.on('data', function(chunk) {
meta += chunk;
});
response.on('end', function(error) {
callback(error, meta);
})
});
获取实际文件
var file = fs.createWriteStream(GDRIVE_ROOT + '\' + JSON.parse(meta).originalFilename);
var options = {
hostname : url.parse(JSON.parse(meta).downloadUrl).hostname,
method : 'GET',
port : 443,
path : url.parse(JSON.parse(meta).downloadUrl).path,
headers : {
'Authorization' : 'Bearer ' + GOOGLE_ACCESS_TOKEN
}
}
var request = https.request(options, function(response) {
response.pipe(file);
});
request.end();
我让它在 NodeJS 上工作。有没有办法让我在浏览器中实现文件下载。我在 http://jsfiddle.net/LdyruLwv/
有一段使用 fetch 的 non-working 代码传输编码对于浏览器中的应用程序应该是透明的,不用担心。
下面是一个基本的 ajax 文件下载解决方案,它使用 XHR2、blob 和具有下载属性的锚点。
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if (this.readyState == 4 && this.status == 200){
var blobURL = window.URL.createObjectURL(this.response);
var anchor = document.createElement('a');
anchor.download = 'filename.ext';
anchor.href = blobUrl;
anchor.click();
}
}
xhr.open('GET', request_url);
xhr.setRequestHeader('Authorization', 'Bearer ' + GOOGLE_ACCESS_TOKEN);
xhr.responseType = 'blob'; // Get a binary response
xhr.send(jData);