Мне нужна конечная точка (без сервера), которая обслуживает серию файлов, сжатых в zip-файл. Для этого я использую node-zip. Это работает локально для создания простого zip-файла с плоским текстом файла:
const fs = require('fs')
const zip = new require('node-zip')()
const flat_text = 'This is a flat text file'
zip.file('a_file.txt', flat_text)
fs.writeFileSync('/tmp/a_file.zip', zip.generate({base64: false, compression: 'DEFLATE'}), 'binary')
Но когда я пытаюсь реализовать это в лямбде, загруженный zip-файл оказывается поврежденным:
module.exports.weekly = async (event, context) => {
const flat_text = 'This is a flat text file'
zip.file('a_file.txt', flat_text)
return {
headers: {
'Content-Type': 'application/zip, application/octet-stream',
'Content-disposition': `attachment; filename=${`any_name_${new Date().toJSON().slice(0, 10)}.zip`}`
},
body: zip.generate({base64: false, compression: 'DEFLATE'}),
statusCode: 200
}
}
Почему я получаю поврежденный zip-файл?
Обновлять
Что я в итоге сделал, чтобы это исправить:
- Измените тело запроса на строку base64 (jszip:
generateAsync({type: 'base64'})
) - Заставьте API-шлюз обслуживать двоичный контент: https://medium.com/nextfaze/binary-responses-with-serverless-framework-and-api-gateway-5fde91376b76
isBase64Encoded : true
в объект ответа? - person A.Khan   schedule 04.02.2019