node.js - Google Cloud -> Node 服务器 -> React 客户端之间的文件下载,无需保存在服务器本地

标签 node.js google-cloud-storage pipe createwritestream

我正在开发一个企业 CRUD 应用程序,其中一项功能是将订阅的用户个人资料图片存储到 Google Cloud,并在需要时下载以显示它。

事实是,当我需要下载它时,请求来自客户端前端,调用和特定的 GET 路由 - 例如,'/getPic'

然后我的 Node 后端服务器处理此请求,与 Google Cloud 通信并下载文件,或多或少(简化)如下:

let localFile = fs.createWriteStream('temp/writeStreamFile.jpeg');

return new Promise((resolve,reject) =>{

   storage.bucket().file(`users/user123456/profilePicture.jpeg`)
       .createReadStream() 
       .on('end', () => {
           console.log("ended");
           resolve();
       })
       .on('response', ans => {
           console.log("responded");
       })
       .on('error', err => {
           console.error("Error", err);
           reject();
       })
       .pipe(localFile);
})

然后,我在HTTP请求的响应中返回这张图片,就可以了。此操作的缺点是下载的文件仍然存储在我的网络服务器中的文件夹 ('temp/writeStreamFile.jpeg') 中,消耗我的服务器存储空间。

有没有办法直接在 HTTP 请求的响应中“管道”文件而不将其保存在本地?

最佳答案

如果您不想在服务器中存储图像的临时副本,您可以生成并发送给您的用户 GCS Signed URLs 。这些 URL 允许在有限的时间内访问存储桶文件,然后就会过期。由于看起来您正在使用 GCS 的 Node 客户端,因此有一种生成这些 URL 的简单方法,如 documentation 中所示。 .

这是文档中的片段:

const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
const myBucket = storage.bucket('my-bucket');

const file = myBucket.file('my-file');

//-
// Generate a URL that allows temporary access to download your file.
//-
const request = require('request');

const config = {
  action: 'read',
  expires: '03-17-2025',
};

file.getSignedUrl(config, function(err, url) {
  if (err) {
    console.error(err);
    return;
  }

  // The file is now available to read from this URL.
  request(url, function(err, resp) {
    // resp.statusCode = 200
  });
});

使用此方法,用户客户端可以直接下载图像,文档引用中还有其他示例,可让您调整选项,例如要使用的 URL 的可用时间。

关于node.js - Google Cloud -> Node 服务器 -> React 客户端之间的文件下载,无需保存在服务器本地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70610010/

相关文章:

Android:是否可以将存储在 Google Cloud Storage 中的图像分享到 Instagram?

linux - BASH 嵌套进程替换

sql - 包含引号的 Postgres 语句管道

javascript - Mongoose 找不到所需的输出

node.js - Algolia 键值搜索

node.js - react : error TypeError: Network request failed

node.js - 从 next() 调用时 req 未定义

google-cloud-storage - 是否可以在不添加index.html的情况下从Google云存储访问目录?

python - 如何使用python将文件分块传输到azure blob存储而不写入文件

c++ - 读\写 boost::binary_oarchive 到管道