Я пытаюсь загрузить файл с api диска Google, используя express.js Итак, я получил поток файлов с Диска и отправил его в ответ. Я также устанавливаю Content-Disposition: attachment, fileName и Content-type. Когда я тестирую этот маршрут с помощью fiddler, он показывает тип содержимого и имя файла. Но при вызове в браузере он загружает файлы, но не устанавливает имя файла и его расширение. Например: 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);
});
})Да, я проверил, но не нашел никакой помощи. Но после долгого тестирования проблема обнаружилась.





После некоторого тестирования и мозгового штурма проблема была обнаружена. Итак, 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);
});
Вы проверили этот самый проблема в гитхабе?