Google Storage存储gzip文件自动解压及Cache-Control配置不生效问题
问题1:Cache-Control元数据为空的原因
你把Cache-Control配置放错了层级,Firebase Admin SDK依赖的@google-cloud/storage库中,标准HTTP缓存头属于顶层配置项,不需要放到metadata子对象中,metadata字段仅用于存储自定义的非标准元数据,所以你之前的写法不会被SDK识别,导致最终元数据为空。
问题2:下载始终返回明文文本的原因
这是Google Cloud Storage的默认行为:当客户端请求没有携带Accept-Encoding: gzip请求头时,GCS会自动对设置了Content-Encoding: gzip的对象做在线解压,直接返回解压后的明文内容,存储桶中实际保存的仍然是gzip压缩后的文件,没有被修改。
如果需要下载获取压缩后的二进制内容,请求时必须主动在请求头中添加Accept-Encoding: gzip。
修正后的上传代码
const admin = await import("firebase-admin"); const bucket = admin.storage().bucket(); const file = bucket.file(path); await file.save(JSON.stringify(jsonArray), { gzip: true, contentType: 'application/json', // Cache-Control直接放在顶层配置,不要放到metadata里 cacheControl: 'no-transform', // 有自定义元数据时才放到metadata对象中 metadata: {} })
验证方法
- 上传完成后可在GCS控制台查看对象元数据,确认
Cache-Control已经正确显示为no-transform - 验证存储的是压缩文件:在控制台直接下载原始对象,查看本地文件大小和压缩前的JSON大小对比即可确认
- 验证压缩下载:Postman请求时在Headers栏添加
Accept-Encoding: gzip,即可得到gzip压缩后的二进制响应
内容的提问来源于stack exchange,提问作者bigbang489
相关产品推荐
相关产品推荐

