firebase - 如何使用生产存储桶数据启动 Firebase 存储模拟器?

标签 firebase google-cloud-firestore google-cloud-storage firebase-storage

我正在使用 Firebase 模拟器运行所有 Firebase 服务。我已成功通过运行以下命令来运行模拟器并备份 Firestore 数据:

firebase 模拟器:start --import ./my-directory

...但我找不到对我的存储数据执行相同操作的方法。

最佳答案

导出

您可以使用 gsutil 导出数据。

gsutil -m cp -R gs://$STORAGE_BUCKET $OUT_DIR

这将创建 $OUT_DIR 指定的目录并下载存储桶 $STORAGE_BUCKET 中的所有内容

导入

要导入模拟器,您可以使用 REST api。

首先,查看哪个是存储模拟器端点:

enter image description here

您可以使用PUT上传文件。端点 URL 为 http://$END_POINT/v0/b/$STORAGE_BUCKET/o/$DEST_ENCODED。并且该文件必须作为数据二进制文件传递到正文。

这是curl语句:

curl -X PUT --data-binary @./$FILE http://$END_POINT/v0/b/$STORAGE_BUCKET/o/$DEST_ENCODED

例如,如果您的存储桶名称为 my_bucket.appspot.com,并且您想要上传根目录上的文件 photo.png,则 URL 为 http://127.0.0.1:19199/v0/b/my_bucket.appspot.com/o/photo.png

curl -X PUT --data-binary @./photo.png http://127.0.0.1:19199/v0/b/my_bucket.appspot.com/o/photo.png

如果要上传的文件必须位于目录内,则斜杠分隔必须使用 %2F 进行编码。例如,要将文件 photo.png 上传到 user/48329884/photo.png,URL 必须为:http://127.0.0.1:19199/v0/b/my_bucket.appspot.com/o/user%2F48329884%2Fphoto.png

curl -X PUT --data-binary @./photo.png http://127.0.0.1:19199/v0/b/my_bucket.appspot.com/o/user%2F48329884%2Fphoto.png

上传文件始终标记有内容类型application/octet-stream。更改标题请愿书上的内容类型不会产生任何效果。

要更改内容类型,您必须使用相同的端点,但使用 PATCH 动词,并传递表示要更改的元数据的文件。

curl -X PATCH --data-binary @./metadata_import.json -H "Content-Type: application/json" http://127.0.0.1:19199/v0/b/$STORAGE_BUCKET/o/$DEST_ENCODED

元数据 json 文件必须如下所示:

{
  "contentType": $CONTENT_TYPE
}

例如,将上一示例的内容类型更改为 image/png:

metada_import.json 文件必须包含:

{
  "contentType": "image/png"
}

URL 必须是:

curl -X PATCH --data-binary @./metadata_import.json -H "Content-Type: application/json" http://127.0.0.1:19199/v0/b/my_bucket.appspot.com/o/user%2F48329884%2Fphoto.png

用于导出和导入的 Bash 文件

我创建了两个 bash 文件,用于从任何环境导出并导入到模拟器。

如果愿意克隆存储库:https://github.com/dumabg/storage_export_import_emulator

storage_export.sh

#!/bin/bash
Red='\033[1;31m'
White='\033[1;37m'
if [ -z $1 ]; then
    printf "${Red}Error parameters: ${White}$0 <storage bucket> <out dir>\n"
    echo "storage bucket without .appspot.com"
    echo "out dir default to out"
    exit 1
fi
if [ -z $2 ]; then
    OUT="out"
else
    OUT=$2
fi
echo $OUT
gsutil -m cp -R gs://$1.appspot.com $OUT

storage_import.sh

#!/bin/bash
Red='\033[1;31m'
White='\033[1;37m'
if [ -z $1 ]; then
    printf "${Red}Error parameters: ${White}$0 <storage bucket> <dir>\n"
    echo "storage bucket without .appspot.com"
    exit 1
fi
export STORAGE_BUCKET=$1
export SRC_DIR=$2
import_file() {
    FILE=$1
    DEST=${FILE/$SRC_DIR/}
    DEST_ENCODED=${DEST////%2F}
    curl -X PUT --data-binary @./$FILE http://127.0.0.1:19199/v0/b/$STORAGE_BUCKET.appspot.com/o/$DEST_ENCODED
    curl -X PATCH --data-binary @./metadata_import.json -H "Content-Type: application/json" http://127.0.0.1:19199/v0/b/$STORAGE_BUCKET.appspot.com/o/$DEST_ENCODED
    return 0
}
export -f import_file

find $2 -type f -print0 | xargs -0 -I {} bash -c 'import_file "{}"'

metada_import.json

{
  "contentType": "image/jpeg"
}

关于firebase - 如何使用生产存储桶数据启动 Firebase 存储模拟器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69472816/

相关文章:

python - 将 for 循环与 firestore 数据迭代 API 请求结合使用时出现 JSONDecodeError

python - SDK 上 Cloudstorage 文件的 URL

python - 如何迭代谷歌云存储中的所有文件以用作数据流输入?

javascript - Firebase .on ('value' ) 不工作

java - 获取数据库中另一种User类型的userId

javascript - 为什么 Twilio 和 Firebase 不能使用 Node.js 协同工作?

node.js - 从 firebase 函数获取返回值?

date - 如何使用Firestore仅从特定日期获取数据?

firebase - 注销时取消订阅 Firestore 监听器

python-3.x - Google Storage python api 并行下载