Просматривать и не загружать файлы Google Cloud Storage в браузере - PullRequest
0 голосов
/ 09 марта 2020

Я работаю с NodeJs / express, чтобы создать конечную точку API POST для загрузки файлов в облачное хранилище Google и возврата URL-адреса publi c, например: https://storage.googleapis.com/ [BUCKET_NAME] / [OBJECT_NAME]

Когда загрузка завершена, я получаю URL, и когда я его открываю, файл загружается напрямую (image, pdf et c ...)

Есть ли способ просмотреть и открыть его в браузере?

вот моя функция загрузки:

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)

})

Спасибо

1 Ответ

2 голосов
/ 09 марта 2020

Если URL выглядит как приведенный выше код, https://storage.googleapis.com/bucketName/objectName, браузер должен иметь возможность просматривать его напрямую, при условии соблюдения нескольких условий:

  • Объект contentType установлен соответственно. Если тип не указан, по умолчанию используется значение application/octet-stream, и веб-браузеры, вероятно, решат просто загрузить такой объект, а не отображать его в какой-либо форме.
  • Метаданные объекта не переопределяют contentDisposition. , Можно принудительно загружать объекты в виде вложений, задав для этого свойства что-то вроде attachment; filename=foo.txt.
  • Объект доступен для публичного просмотра или в GET-запросе передаются соответствующие учетные данные. Это не настройка по умолчанию. Когда вы загружаете объект, вам нужно явно отметить, что ACL должен разрешить группе allUsers разрешение на чтение. Кроме того, вы можете установить свойство ACL объекта по умолчанию для контейнера, чтобы включить это разрешение.

В вашем случае объект загружается успешно, так что это не проблема ACL, и если вы этого не сделаете знать о настройке contentDisposition, то это, вероятно, проблема № 1. Убедитесь, что вы указали разумный тип содержимого для объекта.

Пример:

const blobStream = blob.createWriteStream({
  resumable: false
  contentType: "text/html"
})
...