从 AWS Lambda 提供 zip 文件
Serve zip file from AWS Lambda
我需要一个端点(无服务器)来提供一系列压缩在 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')
但是当我尝试在 lambda 中实现它时,下载的 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
将响应编码为 Base64 编码字符串。
最简单的方法是压缩文件并放回同一个存储桶,然后获取该文件的 SignedUrl。
我需要一个端点(无服务器)来提供一系列压缩在 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')
但是当我尝试在 lambda 中实现它时,下载的 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
将响应编码为 Base64 编码字符串。
最简单的方法是压缩文件并放回同一个存储桶,然后获取该文件的 SignedUrl。