从Google Cloud Storage上的文件将ReadStream传递到POST表单

时间:2019-03-29 14:49:40

标签: node.js firebase google-cloud-storage

我正在尝试发送包含(原始)文件的POST表单,这些文件位于Google云存储桶中

此代码在firebase云功能中运行-我想直接将表单传递给Stream,而不是将存储文件下载到云功能实例,然后通过表单(有效)上传它。

async function test() {
 const rp = require('request-promise');
 const path = require('path');
 const { Storage } = require('@google-cloud/storage');
 const storage = new Storage();
 const bucketName = 'xxx';
 const bucket = storage.bucket(bucketName);
 const fileAPath = path.join('aaa', 'bbb.jpg');

 let formData = {
  fileA: bucket.file(fileAPath).createReadStream(),
 };

 return rp({
  uri: uri,
  method: 'POST',
  formData: formData,
 });
}

如果我们先下载文件(到云功能实例上的临时文件),然后使用fs.createReadStream(fileAPath_tmp)

,则POST会按预期工作

使用bucket.file(fileAPath).createReadStream()

使用上述代码(无临时下载)时,POST失败(即,端点根本没有以相同的方式接收文件)

1 个答案:

答案 0 :(得分:1)

基于Google文件存储createReadStream的文档,您需要使用读取流,就好像它是事件发射器一样,以填充缓冲区以返回给最终用户。您应该能够使用.pipe()方法将其直接通过管道传递到HTTP响应,类似于您现有的源代码。

remoteFile.createReadStream()
  .on('error', function(err) {})
  .on('response', function(response) {
    // Server connected and responded with the specified status and headers.
   })
  .on('end', function() {
    // The file is fully downloaded.
  })
  .pipe(.....));