我一直在尝试使用express.js从Google驱动器api下载文件
因此,我一直在从云端硬盘获取文件流并作为响应进行发送。我还要设置content-disposition:attachment,fileName和Content-type。
当我使用提琴手测试此路由时,它会显示内容类型和文件名。但是,当在浏览器中调用时,它会下载文件,但不会设置fileName及其扩展名。
例如:MineType是image / jpeg,它将以jfif格式下载文件,并带有随机名称。
一些帮助将不胜感激。谢谢
以下是我正在使用的代码段
function downloadFile(auth,fileId){
return new Promise((success,failure)=>{
const drive = google.drive({version: 'v3', auth});
drive.files.get({
fileId:fileId,
alt:'media'
},
(err,res)=>{
if(err)
return failure("Unable to download file");
return success(res.data);
});
});
}
app.get('/DownloadFile/:id',function(req,res){
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
Drive.readFile(CREDENTIALS_PATH)
.then((credentials)=>{
readTokens() //will call db.readTokens here
.then((returnObj)=>{
token=returnObj.token;
refreshToken=returnObj.refreshToken;
Drive.createAuthOjectWithTokenRefresh(credentials,token,refreshToken)
.then((oAuth2Client)=>{
Drive.getFileDetails(oAuth2Client,req.params.id)
.then((details)=>{
res.header("Content-Disposition","attachment");
res.header("filename",details.name);
res.header("Content-Type",details.mimeType);
Drive.downloadFile(oAuth2Client,req.params.id)
.then((file)=>{
res.send(file);
res.end();
})
.catch((err)=>{
res.end(err.message);
});
})
.catch((err)=>{
res.end(err.message);
});
})
.catch((err)=>{
res.end(err.message);
});
})
.catch((err)=>{
res.redirect("/Authenticate");
res.end();
});
})
.catch((err)=>{
res.redirect(err);
});
})
答案 0 :(得分:0)
经过一些测试和头脑风暴,发现了问题。因此,Google Drive Api以JSON字符串格式发送文件数据。当以字符串形式发送时,它将丢失大多数字符,并且文件会损坏。发现Get函数接收一个名为responseType的可选参数,该参数可以接收“ arraybuffer”,“ blob”,“ document”,“ json”,“ text”,“ stream”作为值。驱动器api中未记录此可选参数。 https://developers.google.com/drive/api/v3/reference/files/get
对我有用的东西
drive.files.get({
fileId:fileId,
alt:'media'
},{
responseType:'arraybuffer'
},
(err,res)=>{
if(err)
return failure("Unable to download file");
return success(res.data);
});