我正在使用Firebase Emulator来运行所有Firebase服务。我已经通过运行以下命令成功运行了带有Firestore数据备份的模拟器:firebase emulators:start --import ./my-directory...但我找不到对存储数据执行相同操作的方法。
firebase emulators:start --import ./my-directory
wxclj1h51#
Firestore有一个导入和导出的选项,而Firebase存储还没有这个功能(存储使用上传和下载)。目前,在存储模拟器中还没有原生的方式来导入Google云存储数据。此外,您可以通过在模拟器中上传示例文件,然后运行导出来研究模拟器如何注册对象,您将看到模拟器需要1个对象和1个包含其元数据的JSON文件。现在,您需要从生产桶中下载对象沿着包含其元数据的单独JSON文件,然后将其结构化以供导入。在github中也有一个opened issue,你也可以监视它。
xzv2uavs2#
虽然@RJC的答案是正确的,但我想分享我所做的。在启动模拟器的时候可以添加选项--export-on-exit,它会将本地Firebase示例的状态导出到您选择的文件夹中,所以我从真实的的Firebase项目中下载了所有的数据,用Emulator上传了所有的内容,然后杀死了模拟器。导出了所有内容(包括存储),现在我使用--import选项启动它,并使用导出所有内容的同一文件夹。这不是很可怕,因为我没有那么多的东西在我的存储。
--export-on-exit
--import
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 的句子:
PUT
http://$END_POINT/v0/b/$STORAGE_BUCKET/o/$DEST_ENCODED
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。
my_bucket.appspot.com
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.
%2F
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 ,并传递表示要更改的元数据的文件。
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,请执行以下操作:
image/png
{ "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文件,用于从任何环境导出和导入到模拟器。如果选择克隆存储库:https://github.com/dumabg/storage_export_import_emulator
#!/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
#!/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 "{}"'
{ "contentType": "image/jpeg" }
3条答案
按热度按时间wxclj1h51#
Firestore有一个导入和导出的选项,而Firebase存储还没有这个功能(存储使用上传和下载)。目前,在存储模拟器中还没有原生的方式来导入Google云存储数据。
此外,您可以通过在模拟器中上传示例文件,然后运行导出来研究模拟器如何注册对象,您将看到模拟器需要1个对象和1个包含其元数据的JSON文件。现在,您需要从生产桶中下载对象沿着包含其元数据的单独JSON文件,然后将其结构化以供导入。
在github中也有一个opened issue,你也可以监视它。
xzv2uavs2#
虽然@RJC的答案是正确的,但我想分享我所做的。
在启动模拟器的时候可以添加选项
--export-on-exit
,它会将本地Firebase示例的状态导出到您选择的文件夹中,所以我从真实的的Firebase项目中下载了所有的数据,用Emulator上传了所有的内容,然后杀死了模拟器。导出了所有内容(包括存储),现在我使用--import
选项启动它,并使用导出所有内容的同一文件夹。这不是很可怕,因为我没有那么多的东西在我的存储。
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 的句子:
例如,如果您的存储桶的名称为
my_bucket.appspot.com
,并且您希望在根目录上上载文件 * photo. png *,则URL为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
.上传的文件总是被标记为
application/octet-stream
类型。更改标题请求的内容类型没有任何效果。若要更改内容类型,必须使用相同的终结点,但要使用
PATCH
predicate ,并传递表示要更改的元数据的文件。元数据json文件必须如下所示:
例如,要将内容类型更改为
image/png
,请执行以下操作:并且URL必须为:
我创建了两个bash文件,用于从任何环境导出和导入到模拟器。
如果选择克隆存储库:https://github.com/dumabg/storage_export_import_emulator