我正在使用 Firebase 模拟器运行所有 Firebase 服务。我已成功通过运行以下命令来运行模拟器并备份 Firestore 数据:
firebase 模拟器:start --import ./my-directory
...但我找不到对我的存储数据执行相同操作的方法。
最佳答案
导出
您可以使用 gsutil 导出数据。
gsutil -m cp -R gs://$STORAGE_BUCKET $OUT_DIR
这将创建 $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
动词,并传递表示要更改的元数据的文件。
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/