python - Firebase 存储:以编程方式从 /tmp/ 中删除文件
问题描述
我搞砸了一个 Firebase 云功能,不小心创建了 190 万张存储在gs://myapp.appspot.com//tmp/
. 那个双斜杠是准确的——服务器正在写入/tmp/
,我猜这会导致上面提到的路径。
我现在想删除那些文件(它们都是废话)。我尝试像这样使用 Python 包装器:
export GOOGLE_APPLICATION_CREDENTIALS="../secrets/service-account.json"
然后:
from google.cloud import storage
storage_client = storage.Client()
bucket = storage_client.get_bucket('tmp')
blobs = bucket.list_blobs(bucket='tmp', prefix='')
for blob in blobs:
print(' * deleting', blob)
blob.delete()
但这会引发:
google.api_core.exceptions.Forbidden: 403 GET https://storage.googleapis.com/storage/v1/b/tmp?projection=noAcl: firebase-adminsdk-yr6f8@myapp.iam.gserviceaccount.com does not have storage.buckets.get access to tmp.
有谁知道如何允许管理员凭据从中删除/tmp/
?任何指针都会非常有帮助!
解决方案
我能够使用 gsutil 命令重现此问题:
gsutil cp ~/<example-file> gs://<my-project-name>.appspot.com//tmp/
首先,在我的 Firebase 控制台中,我可以通过一个勾号(整个文件夹)来完成,不确定您是否考虑这一点。
无论如何,如果您想使用 API 完成它,我已经找到了以下解决方案。
- 我认为(与我的测试相比)存储桶名称应该是:
myapp.appspot.com
- 如果你在 python 中打印 blob,你会得到这样的结果:
<Blob: <my-project-name>.appspot.com, /tmp/<example-file>, 1584700014023619
>
第二个值是 blob 对象的名称属性。我注意到在这种情况下,它的 blob 名称以/tmp/
对我有用的代码是:
from google.cloud import storage
storage_client = storage.Client()
bucket = storage_client.get_bucket('myapp.appspot.com')
blobs = bucket.list_blobs()
for blob in blobs:
if blob.name.startswith('/tmp/'):
print(' * deleting', blob)
blob.delete()
我认为它不是非常优雅的解决方案,但一次修复可能就足够了。
我希望它会有所帮助!
推荐阅读
- php - Oauth 1.0 的 Php cUrl 请求出现错误 401
- java - hibernate 中的 saveOrUpdate() 不起作用,而是执行了一个在程序中没有提到的选择查询。(使用弹簧+休眠)
- css - 在背景图片 url 我有 [site_url] 而不是 wordpress 中的真实 url
- python - Jupyter notebook,如何在正确的conda环境中执行系统shell命令?
- css - Flexbox:如何垂直居中
- apache-nifi - 哪个 Nifi 处理器用于 RDBMS 提取
- angular6 - 如何为我的 ng-content 所有子 html 元素设置 css 边距?
- javascript - 未捕获的 TypeError:无法设置 null 错误的属性“innerHTML”
- batch-file - BATCH(Windows 命令提示符)- FORFILES 返回“错误:参数不正确”。
- javascript - jQuery preventDefault 不适用于我通过另一个 ajax 调用添加的表单