【问题标题】:Issue with downloading file express.js下载文件 express.js 的问题
【发布时间】:2019-03-16 22:36:01
【问题描述】:

我一直在尝试使用 express.js 从 Google drive api 下载文件 所以我一直在从云端硬盘获取文件流并发送它作为响应。我还在设置内容处置:附件、文件名和内容类型。 当我使用提琴手测试这条路线时,它会显示内容类型和文件名。但是当在浏览器中调用时,它会下载文件但不设置文件名及其扩展名。 例如:MineType 是 image/jpeg,它以随机名称的 jfif 格式下载文件。 一些帮助将不胜感激。谢谢
以下是我正在使用的代码 sn-ps

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);
	});
})

【问题讨论】:

  • 你在 github 上检查过同样的issue 吗?
  • 是的,我已经检查过了,但找不到任何帮助。但经过大量测试发现问题。

标签: node.js express download google-drive-api


【解决方案1】:

经过一些测试和头脑风暴后发现了问题。因此 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);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2020-11-24
    • 2012-06-20
    • 2011-02-07
    相关资源
    最近更新 更多