我创建了生成xlsx文件的云函数,文件生成后,我需要用户下载该文件。
到目前为止,我已经尝试使用此API将文件上传到存储桶,然后将其重定向到存储桶文件url,我也使用此API仔细检查了存储桶名称,但是我每次都会得到相同的错误:
{“错误”:{“代码”:500,“状态”:“内部”,“消息”:“功能崩溃”,“错误”:[“套接字挂断”]}}}
包含上传到存储桶的代码部分:
const { Storage } = require('@google-cloud/storage');
const storage = new Storage();
await storage.bucket('bucket-name').upload('myfile.xlsx', {
gzip: false,
});
证明文件存在的代码部分:
fs.access('myfile.xlsx', fs.constants.F_OK, (err) => {
console.log(`${file} ${err ? 'does not exist' : 'exists'}`);
});
我还检查了“ @ google-cloud / storage”库是否读取了文件,并且正确读取了文件并获得了正确的文件大小。
直接下载文件,问题在于,每个在线供nodejs下载本地文件给用户的文档都在设置自定义服务器来下载文件,但是我使用的是Firebase,因此它无法控制服务器。
答案 0 :(得分:2)
如果您的excel文件已创建,并且应作为对HTTP请求(调用API端点)的响应返回给客户端,那么您将可以执行此操作。
export const getExcelFile = functions.https.onRequest(async (request, response) => {
// ...
// Create your file and such
// ..
await storage.bucket('bucket-name').upload('myfile.xlsx', {
gzip: false,
});
response.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
response.send(fs.readFileSync('myfile.xlsx'));
return null;
});
否则,如果将excel文件创建为对事件的响应,并且您希望用户在其他时间下载该文件,则可以创建一个下载链接,并以所需的任何方式将其提供给用户。 / p>
// ...
// Create your file and such
// ..
const [file] = await storage.bucket('bucket-name').upload('myfile.xlsx', {
gzip: false,
});
const [downloadUrl] = await file.getSignedUrl({
action: 'read',
expires: '20-03-2019' // Link expiry date: DD-MM-YYYY
});
console.log(downloadUrl);
答案 1 :(得分:0)
只想在答案中添加更多细节,因为无需写入文件并从文件中读取数据来下载其数据,只需使用以下几行内容就可以将数据发送出去。
res.setHeader('Content-Type', 'application/vnd.openxmlformats');
res.setHeader("Content-Disposition", "attachment; filename=" + fileName);
res.end(xlsData, 'binary');