Вот решение для быстрого исправления:
403 ошибка прямой ссылки Google Диска из-за нескольких учетных записей, зарегистрированных в
Вы можете использовать drive.google.com/u/1/uc?id=DOCID или
drive.google.com/a/mycorporatedomain.com/uc?id=DOCID
Однако не полагайтесь на то, что эти URL не изменятся в будущем.
Вот более надежное решение, если вы используете серверный API:
Идея состоит в том, чтобы перехватить ссылку, по которой щелкают, получить необходимые метаданные (ID, имя файла, mimeType) и запросить файл у Google через сервер Node. Вы можете указать ответ в виде потока и отправить этот поток для открытия через встроенное вложение.
Эти две ссылки помогут:
узел / экспресс Принудительный браузер для загрузки файла с произвольным именем
Как отправить файл с удаленного URL-адреса в виде ответа GET в приложении Node.js Express?
В контексте приложения Express, вот как это может выглядеть:
// I'm using an async function here, but it may not be best practice.
app.get('/download', async function(req, res, next) {
// get the metadata from req.query
const fileId = req.query.id;
const filename = req.query.name;
const mimeType = req.query.mimeType;
const inlineFilename = `inline;filename=${ filename }`;
// Set the Content-Disposition to specify a filename
// Set the Content-Type to accept a stream, because that's what we want back from google.
res.set("Content-Disposition", inlineFilename);
res.set("Content-Type", "application/octet-stream");
// This returns a data stream from google so that we are able to pipe the result.
const fileStream = await downloadFile(fileId);
// Pipe the stream to the res. This sends the file stream to the client to be downloaded
fileStream.pipe(res);
});
downloadFile может выглядеть примерно так (с помощью google-api-nodejs-client ):
downloadFile: async function(fileId) {
try {
const response = await drive.files.get(
{fileId, alt: 'media'},
{responseType: 'stream'}
);
return response.data
} catch (error) {
console.error(error);
}
}