Firebase Cloud Function服务供下载的本地文件

时间:2019-03-20 12:17:05

标签: node.js firebase download google-cloud-platform google-cloud-functions

我创建了生成xlsx文件的云函数,文件生成后,我需要用户下载该文件。

方法1:上传到存储桶,然后重定向

到目前为止,我已经尝试使用此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”库是否读取了文件,并且正确读取了文件并获得了正确的文件大小。

方法2:直接下载

直接下载文件,问题在于,每个在线供nodejs下载本地文件给用户的文档都在设置自定义服务器来下载文件,但是我使用的是Firebase,因此它无法控制服务器。

2 个答案:

答案 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');