在浏览器中查看而不是下载 Google Cloud Storage 文件

xge*_*k95 5 node.js express google-cloud-storage google-cloud-platform multer

我正在与 NodeJs/express 合作创建一个 POST api 端点以将文件上传到谷歌云存储并返回这样的公共 URL:https ://storage.googleapis.com/[BUCKET_NAME]/[OBJECT_NAME ]

上传完成后,我得到了 URL,当我打开它时,直接下载文件(图像、pdf 等...)

有没有办法在浏览器中查看和打开它?

这是我的上传功能:

const uploadImage = (file) => new Promise((resolve, reject) => {
  const { originalname, buffer } = file

  const blob = bucket.file(originalname.replace(/ /g, "_"))
  const blobStream = blob.createWriteStream({
    resumable: false
  })

  blobStream.on('finish', () => {
    const publicUrl = format(
      `https://storage.googleapis.com/${bucket.name}/${blob.name}`
    )
    resolve(publicUrl)
  })
  .on('error', () => {
    reject(`Unable to upload image, something went wrong`)
  })
  .end(buffer)

})
Run Code Online (Sandbox Code Playgroud)

谢谢

Bra*_*ugh 5

如果 URL 看起来像上面的代码https://storage.googleapis.com/bucketName/objectName,那么浏览器应该可以直接查看它,只要满足以下几个条件:

  • 对象的 contentType 设置适当。如果您不指定类型,则默认为application/octet-stream,并且 Web 浏览器可能会决定只下载此类对象,而不是以某种形式显示它。
  • 对象的元数据不会覆盖 contentDisposition。通过将该属性设置为类似attachment; filename=foo.txt.
  • 该对象可以公开查看,或者在 GET 请求中传递了适当的凭据。这不是默认设置。上传对象时,您需要明确指出 ACL 应允许组allUsers读取权限。或者,您可以设置存储桶的默认对象 ACL 属性以包含该权限。

在你的情况下,对象下载成功,所以这不是 ACL 问题,如果你不知道 contentDisposition 设置,那么它可能是问题 #1。确保为对象指定合理的内容类型。

例子:

const blobStream = blob.createWriteStream({
  resumable: false
  contentType: "text/html"
})
Run Code Online (Sandbox Code Playgroud)