Проблема с загрузкой файла express.js - PullRequest
0 голосов
/ 11 октября 2018

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

1 Ответ

0 голосов
/ 12 октября 2018

После некоторого тестирования и мозгового штурма обнаружил проблему.Таким образом, Google Drive Api отправляет данные файла в формате строки JSON.При отправке в виде строки он теряет большую часть символов и файл повреждается.Обнаружено, что функции Get получают необязательный параметр с именем responseType, который может принимать значения 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream' в качестве значения.Этот необязательный параметр не задокументирован в интерфейсе привода.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);
});
...