【发布时间】:2020-06-23 08:52:01
【问题描述】:
我的 API 端点返回一个从 S3 流式传输的 excel 文件。它适用于本地,但在 API 网关上测试时文件已损坏。这是我的 API 代码:
const downloadContentFromS3 = async function(bucket, file) {
return new Promise((resolve, reject) => {
streamFileFromS3(bucket, file, (error, s3buffer) => {
if (error) return reject(error);
return resolve(s3buffer);
});
});
};
const streamFileFromS3 = async function(bucket, fileName, callback) {
const params = {
Bucket: bucket,
Key: fileName,
};
const buffers = [];
const stream = s3.getObject(params).createReadStream();
stream.on('data', data => buffers.push(data));
stream.on('end', () => callback(null, Buffer.concat(buffers)));
stream.on('error', error => callback(error));
};
downloadExcelFile: async (req, res) => {
try {
const fileName = 'myFilename';
const workbook = await downloadContentFromS3(
'bucket-name'
fileName
);
const workbook = xlsx.read(buffer);
res.setHeader('Content-disposition', `attachment; filename=${fileName}`);
res.setHeader(
'Content-type',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
);
const wbout = xlsx.write(workbook, { bookType: 'xlsx', type: 'buffer' });
res.status(200).send(Buffer.from(wbout));
} catch (error) {
throw new OriolaError(error.message);
}
},
另外尝试将 RESPONSE HEADER 设置为 Content-Type 和 Content-Disposition 但无济于事。问题似乎仍然存在。任何想法和帮助表示赞赏。
编辑:我也尝试在设置中设置二进制类型*/*,但这也无济于事。
【问题讨论】:
-
base64 怎么样?也许它是以 base64 编码下载的?
-
我怎样才能使它正确呢?提供可以实现此目的的标头选项。
标签: node.js amazon-web-services express aws-lambda aws-api-gateway