【问题标题】:How to set the destination for file.download() in Google Cloud Storage?如何在 Google Cloud Storage 中设置 file.download() 的目的地?
【发布时间】:2018-11-07 18:29:11
【问题描述】:

download() 的 Google Cloud Storage documentation 建议可以指定目标文件夹:

file.download({
  destination: '/Users/me/Desktop/file-backup.txt'
}, function(err) {});

无论我在文件中输入什么值,始终会在根级别下载到 Firebase Cloud Storage。这个question 表示路径不能有初始斜杠,但将示例更改为

file.download({
  destination: 'Users/me/Desktop/file-backup.txt'
}, function(err) {});

没有区别。

将目的地更改为

file.download({
      destination: ".child('Test_Folder')",
    })

导致错误信息:

EROFS: read-only file system, open '.child('Test_Folder')'

云存储destination(文件夹和文件名)的正确语法是什么?

将存储桶从 myapp.appspot.com 更改为 myapp.appspot.com/Test_Folder 导致错误消息:

Cannot parse JSON response

此外,示例路径似乎指定了个人计算机硬盘驱动器上的位置。为Desktop 设置云存储文件夹似乎很奇怪。这是否意味着有一种方法可以在 Cloud Storage 以外的地方指定目的地?

这是我的代码:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp();

exports.Storage = functions.firestore.document('Storage_Value').onUpdate((change, context) => {

  const {Storage} = require('@google-cloud/storage');
  const storage = new Storage();
  const bucket = storage.bucket('myapp.appspot.com');

  bucket.upload('./hello_world.ogg')
  .then(function(data) {
    const file = data[0];
    file.download({
    destination: 'Test_Folder/hello_dog.ogg',
  })
    .then(function(data) {
      const contents = data[0];
      console.log("File uploaded.");
    })
    .catch(error => {
      console.error(error);
    });
  })
  .catch(error => {
    console.error(error);
  });
  return 0;
});

【问题讨论】:

    标签: firebase google-cloud-storage google-cloud-functions firebase-storage


    【解决方案1】:

    根据documentation

    文件系统中唯一可写的部分是 /tmp 目录,它 您可以使用将临时文件存储在函数实例中。这是一个 本地磁盘挂载点,称为“tmpfs”卷,其中写入数据 到卷存储在内存中。注意会消耗内存 为该功能提供的资源。

    文件系统的其余部分是只读的,可供 函数。

    您应该使用os.tmpdir() 来获取当前运行时的最佳可写目录。

    【讨论】:

    • Doug,我并不想将我的文件保存到 Google Functions Environment,尽管有时这可能会派上用场。 file.download() 是一个云存储命令,所以默认是下载到云存储,进入根级别。我的问题是如何指定不同的目的地,因为文档说是可能的。我认为这只是一个语法问题。
    • 你一定是对 API 有误解。 download() 用于将文件从 Cloud Storage 下载到本地计算机。 upload() 用于将本地内容上传到云存储。
    • 我尝试将存储桶从“myapp.appspot.com”更改为“myapp.appspot.com/Test_Folder”。结果是一条错误消息“无法在 ApiError 解析 JSON 响应。”
    • 我认为您现在从根本上误解了云存储的工作原理。存储桶名称不包含文件夹或路径。文件名中应包含任何类型的文件名或路径。
    • 我刚刚发现 upload() 将文件从我的硬盘复制到云存储。 download() 在我的代码中什么也没做。我会继续玩这个...
    【解决方案2】:

    感谢 Doug,代码现在可以运行了:

    exports.Storage = functions.firestore.document('Storage_Value').onUpdate((change, context) => {
    
      const {Storage} = require('@google-cloud/storage');
      const storage = new Storage();
      const bucket = storage.bucket('myapp.appspot.com');
    
      const options = {
        destination: 'Test_Folder/hello_world.dog'
      };
    
      bucket.upload('hello_world.ogg', options)
      .then(function(data) {
        const file = data[0];
      });
    
      return 0;
    });
    

    该函数从我的项目的functions 文件夹中获取文件hello_world.ogg,然后将其写入我的Firebase 云存储中的Test_Folder,并将文件名更改为hello_world.dog。我复制了下载 URL,音频文件播放完美。

    昨天我觉得将文件写入 Cloud Storage 被称为 download() 似乎很奇怪,而 upload() 更有意义。 :-)

    【讨论】:

      【解决方案3】:

      您可以使用以下代码或命令将文件从 Google Cloud Storage 下载到您的计算机 在你的电脑上安装 python 在您的 PC 上安装 GCS 点安装谷歌云存储 kesaktopdi.appspot.com 下载 .json 文件并将其保存在 /home/login/ 文件夹中 更改您的帐户 https://console.cloud.google.com/apis/credentials/serviceaccountkey?project=kesaktopdi

      import os
      
      ACCOUNT_ID='kesaktopdi'
      
      os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="/home/login/" + ACCOUNT_ID + ".json"
      def download_blob(bucket_name, source_blob_name, destination_file_name):
          storage_client = storage.Client()
          bucket = storage_client.get_bucket(bucket_name)
          blob = bucket.blob(source_blob_name)
          blob.download_to_filename(destination_file_name)
          #print('Blob {} downloaded to {}.'.format(source_blob_name,destination_file_name))
      
      download_blob(ACCOUNT_ID +'.appspot.com',       #account link
                    'user.txt',                       #file location on the server
                    '/home/login/kesaktopdi.txt')     #file storage on a computer
      
      

      您还可以使用以下命令将文件从 Google Cloud Storage 服务器下载到您的计算机。

                       file location on the server     file storage on a computer
      

      gsutil -m cp -r gs://kesaktopdi.appspot.com/text.txt /home/login

      程序由 APIuz 团队https://t.me/apiuz创建

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-26
        • 1970-01-01
        相关资源
        最近更新 更多