如何使用生产存储桶数据启动Firebase Storage Emulator?

jm2pwxwz  于 2023-03-03  发布在  其他
关注(0)|答案(3)|浏览(118)

我正在使用Firebase Emulator来运行所有Firebase服务。我已经通过运行以下命令成功运行了带有Firestore数据备份的模拟器:
firebase emulators:start --import ./my-directory
...但我找不到对存储数据执行相同操作的方法。

wxclj1h5

wxclj1h51#

Firestore有一个导入和导出的选项,而Firebase存储还没有这个功能(存储使用上传和下载)。目前,在存储模拟器中还没有原生的方式来导入Google云存储数据。
此外,您可以通过在模拟器中上传示例文件,然后运行导出来研究模拟器如何注册对象,您将看到模拟器需要1个对象和1个包含其元数据的JSON文件。现在,您需要从生产桶中下载对象沿着包含其元数据的单独JSON文件,然后将其结构化以供导入。
在github中也有一个opened issue,你也可以监视它。

xzv2uavs

xzv2uavs2#

虽然@RJC的答案是正确的,但我想分享我所做的。
在启动模拟器的时候可以添加选项--export-on-exit,它会将本地Firebase示例的状态导出到您选择的文件夹中,所以我从真实的的Firebase项目中下载了所有的数据,用Emulator上传了所有的内容,然后杀死了模拟器。导出了所有内容(包括存储),现在我使用--import选项启动它,并使用导出所有内容的同一文件夹。
这不是很可怕,因为我没有那么多的东西在我的存储。

kg7wmglp

kg7wmglp3#

    • 出口**

可以使用gsutil导出数据。
gsutil-m cp-R gs://$存储桶$输出目录
这将创建$OUT_DIR指定的目录,并下载存储桶$STORAGE_BUCKET中的所有内容

    • 导入**

要导入到模拟器,可以使用REST API。
首先,查看哪个是存储模拟器端点:

可以使用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 predicate ,并传递表示要更改的元数据的文件。

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,请执行以下操作:

  • 元数据_导入. 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

    • 存储导出. 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
    • 存储导入. 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 "{}"'
    • 元数据导入. json**
{
  "contentType": "image/jpeg"
}

相关问题