使用Firebase工具11.21.0
和FIREBASE_STORAGE_EMULATOR_HOST=localhost:9199
以及maven依赖项
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
<version>2.17.1</version>
</dependency>
我启动了firebase模拟器,尝试了一个简单的文件存储:
emulatorStorage = StorageOptions.newBuilder()
.setProjectId(projectId)
.setHost("http://localhost:9199")
.setCredentials(NoCredentials.getInstance())
.build()
.getService();
并尝试保存文件:
byte[] compress = "test".getBytes();
Blob blob = emulatorStorage.create(
BlobInfo.newBuilder(index, filename)
.setContentType("text/plain")
.build()
,compress,
Storage.BlobTargetOption.doesNotExist());
但即使设置了内容类型,我每次都会得到这样的结果:
com.google.cloud.storage.StorageException: Failed to parse multipart request body part. Missing content type.
at com.google.cloud.storage.StorageException.translate(StorageException.java:163)
at com.google.cloud.storage.spi.v1.HttpStorageRpc.translate(HttpStorageRpc.java:297)
at com.google.cloud.storage.spi.v1.HttpStorageRpc.create(HttpStorageRpc.java:379)
at com.google.cloud.storage.StorageImpl.lambda$internalCreate$2(StorageImpl.java:208)
at com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:103)
at com.google.cloud.RetryHelper.run(RetryHelper.java:76)
at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:50)
at com.google.cloud.storage.Retrying.run(Retrying.java:60)
at com.google.cloud.storage.StorageImpl.run(StorageImpl.java:1476)
at com.google.cloud.storage.StorageImpl.internalCreate(StorageImpl.java:205)
at com.google.cloud.storage.StorageImpl.create(StorageImpl.java:151)
通过调试,我知道它正在与本地模拟器对话:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
POST http://localhost:9199/upload/storage/v1/b/demo-project.appspot.com/o?ifGenerationMatch=0&projection=full&uploadType=multipart
{
"code" : 400,
"message" : "Failed to parse multipart request body part. Missing content type."
}
我在保存操作中遗漏了什么,是内容类型错误吗?或者这可能是模拟器中的错误或与云存储库的兼容性问题?
2条答案
按热度按时间lvmkulzt1#
我已经找到了你提出的github issue,并按照步骤从那里与firebase v11.21.0和v11.19.0,但我可以成功地上传视频文件使用
firebase emulators:start --project demo-project --debug
。根据我们在评论中的对话,看起来你把
firebase-tools-linux
误认为是一个命令。你在linux下设置forebase的文档中只会有一个可下载的文件名firebase-tools-linux
。这只是一个文件名,并不意味着对于linux,我们必须使用firebase-tools-linux
作为linux机器的命令。如果你观察到了你分享的文档中的第三步,它指向登录并测试CLI,而我们只能使用firebase login
。因此,请尝试使用firebase emulators:start --project demo-project --debug
命令。我采取的措施
**步骤1:**从共享的github克隆源代码。将目录更改为
firebase-emulator-debug
。**步骤2:**在命令下运行
**第3步:**成功地从模拟器上载了2.3 MB的视频文件。
顺便说一句,我也只在上面的步骤中使用过Linux机器。
km0tfn4u2#
正如@Gridcell Coder提到的,Cloud Storage for Firebase模拟器只支持Cloud API的一个非常小的子集,并且只能通过
firebase-admin
包使用。Admin SDK还不支持Cloud Storage for Firebase。