无法使用Admin SDK for Node.js在Firebase Storage中将内容处置替换为“内联”

时间:2018-08-02 10:10:47

标签: node.js firebase firebase-storage firebase-admin

我想将Firebase存储中的默认<?php $name = $_POST['name']; $age = $_POST['age']; echo "$name, $age"; ?> HTTP标头覆盖为content-disposition: attachment,以便从我的存储中提供公共图像,这些图像由浏览器打开(作为content-disposition: inline链接)以供查看(不下载)。

重要的默认标题如下:

<a href="...">

默认情况下,我认为是content-disposition: attachment content-type: image/jpeg 强制下载了图片,这就是为什么我尝试在Firebase Admin SDK中上传时覆盖它:

content-disposition: attachment

我清除了存储中的所有图像,并使用此代码上传了新图像,但仍然得到bucket.upload(photoUrl, { destination, public: true, metadata: { contentDisposition: 'inline', }, }).then((data) => console.log(data[1].mediaLink), ); 。也许是设计使然,也许我的代码是错误的。

图像的网址如下:content-disposition: attachment

如果可能的话,将https://www.googleapis.com/download/storage/v1/b/MY_PROJECT/o/IMAGE_PATH?generation=SOME_NUMBER&alt=media覆盖到content-disposition的正确方法是什么?

相关问题:From firebase storage download file to iframe

更新

在Chrome devtools控制台中,我得到警告:“资源被解释为文档,但以MIME类型image / jpeg传输”。。我尝试将inline扩展名附加到上传的图像目标位置,但仍然收到此警告。

2 个答案:

答案 0 :(得分:1)

元数据字段称为Content-Disposition。您是否尝试过以下类似方法?

const meta = {};
meta['Content-Disposition'] = 'inline';
bucket.upload(photoUrl, {
  destination,
  public: true,
  metadata: meta,
});

答案 1 :(得分:0)

官方答复

我已在GitHub上的nodejs-storage中发布了一个问题,并从@stephenplusplus获得了this response

  

我相信您需要为此行为使用签名的URL。的   mediaLink地址似乎是供下载的,而且   需要访问权限(除非您创建了存储桶/文件   公开)。

     

签名的URL将创建一个唯一的URL供用户访问,与用户无关   在GCS中保护对象的私密性。它还将继承元数据   您设置。要获得在浏览器中打开的已签名URL ...

修改后的代码:

bucket.upload(photoUrl, {
  destination,
}).then((data) => {

  const file = data[0];
  return file.getSignedUrl({
    action: 'read',
    expires: '12-31-2118',
  });
}).then((data) =>
  console.log(data[0]),
);

请参见signed URLs in Cloud Storage documentationFile.getSignedUrl for NodeJS

解决方法

const blob = await fetch(mediaLink).then((res) => res.blob());
const blobUrl = URL.createObjectURL(blob);
// To keep adblockers away from your window:
const win = window.open();
win.document.head.innerHTML = `...<img src="${blobUrl}">...`;