Я пытаюсь передать файл в корзину Firebase через облачную функцию nodeJS клиенту (браузеру). Клиент будет использовать file-saver.js
для запуска загрузки в браузере.
Это хорошо работает с text/plain
типами MIME, но создает поврежденные файлы с изображениями и файлами PNG. Проблема заключается в кодировании, так как я вижу, что данные, которые достигают клиента, не закодированы должным образом.
Вот пример ответа на стороне клиента с изображением:
data: "�PNG↵↵IHDR%�*���sBIT|d�...
Как правильно передать файл обратно для поддержания правильной кодировки?
Вот текущая облачная функция:
const filesBucket = admin.storage().bucket(FILES_BUCKET_NAME);
function getFile(fileName, res){
const filePath = fileName
const file = filesBucket.file(filePath)
res.setHeader('Content-Type', getMimeType(fileName));
res.setHeader('Content-Disposition', 'attachment; filename='+fileName);
file.createReadStream()
.on('error', err => {
// not good
})
.on('response', function(response) {
// ok
})
.on('end', function() {
// The file is fully downloaded.
})
.pipe(res); // pipe the file back to client
}
Вот часть на стороне клиента:
export const getFile = (filename) =>{
...
axios.get(fileUrl, config)
.then(resp => {
downloadFile(resp.data, filename, getMimeType(filename))
}).catch(err => {
console.log("getCurrentUserFile | err", err)
reject(err)
})
function downloadFile(data, filename, mimeType){
var blob = new Blob([data], {type: mimeType});
FileSaver.saveAs(blob, filename);
}