如何编写Firebase Storage规则以允许上传Libre Office格式文件
错误原因说明
- 第一种写法的问题:
request.resource.contentType读取的是文件的MIME类型而非文件扩展名,同时matches()方法接收正则表达式语法,你写的.odt中.会被识别为正则通配符,匹配逻辑完全不符合预期。 - 第二种写法的问题:LibreOffice格式的标准MIME类型不存在
application/odt这类简写,正确的MIME带有OASIS开放文档的规范前缀。
正确实现方案
方案1:基于MIME类型校验(推荐作为核心校验逻辑)
LibreOffice对应格式的标准MIME类型如下:
- odt(文本文档):
application/vnd.oasis.opendocument.text - ods(电子表格):
application/vnd.oasis.opendocument.spreadsheet - odp(演示文稿):
application/vnd.oasis.opendocument.presentation
对应的规则可以合并为单条正则匹配,注意正则中的.需要转义:
allow write: if request.resource.contentType.matches('application/vnd\\.oasis\\.opendocument\\.(text|spreadsheet|presentation)');
方案2:补充文件名后缀校验(可选,提升安全性)
为了避免部分客户端上传时MIME类型标注错误的问题,可以额外加一层文件扩展名校验:
allow write: if request.resource.name.matches('\\.(odt|ods|odp)$');
组合使用的完整示例
两种校验同时开启,覆盖更多异常场景:
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow write: if // 校验MIME类型 request.resource.contentType.matches('application/vnd\\.oasis\\.opendocument\\.(text|spreadsheet|presentation)') // 同时校验文件后缀 && request.resource.name.matches('\\.(odt|ods|odp)$'); } } }
内容的提问来源于stack exchange,提问作者Dima Malko
相关产品推荐
相关产品推荐

