NodeJS 将ReadStream从Google云存储上的文件传递到POST FORM

dohp0rv5  于 2023-04-29  发布在  Node.js
关注(0)|答案(2)|浏览(83)

我试图发送一个POST表单,包括(原始)文件,这些文件位于谷歌云存储桶
这段代码在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将按预期工作
POST失败(i)即端点不以相同的方式接收文件,如果有的话),当使用上面的代码(没有临时下载)使用bucket.file(fileAPath).createReadStream()

xesrikrc

xesrikrc1#

根据Google File Storage 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(.....));
e4eetjau

e4eetjau2#

我设法使用form-data npm包让它工作。我的例子使用了axios,但我猜它与request-promise类似:

import FormData from 'form-data'; // npm install form-data

const uploadFileFromFirebaseStorage = async (bucketName, fileName) => {
   const file = storage.bucket(bucketName).file(fileName);

   const formData = new FormData();
   formData.append('file', file.createReadStream(), fileName);

   const url = 'some-api/upload';
   const headers = { ...getAuthHeaders(), ...formData.getHeaders() };
   return axios.post(url, formData, { headers });
};

相关问题