Почему у меня нет доступа к моим образам хранилища firebase? - PullRequest
0 голосов
/ 27 мая 2020

У меня есть два файла изображений, загруженных в хранилище firebase:

enter image description here

Capsule house.jpg был загружен через пользовательский интерфейс (нажав кнопку «Загрузить файл») .

upload_64e8fd ... загружался с моего внутреннего сервера (node.js), используя это:

const bucket = fbAdmin.storage().bucket('gs://assertivesolutions2.appspot.com');
const result = await bucket.upload(files.image.path);

капсула house.jps распознается как jpeg, и предоставляется ссылка на нее в правом поле. Если я нажму на нее, я увижу свое изображение в новой вкладке. Вы сами можете убедиться:

https://firebasestorage.googleapis.com/v0/b/assertivesolutions2.appspot.com/o/capsule%20house.jpg?alt=media&token=f5e0ccc4-7916-4245-b813-dbdf1838556f

upload_64e8fd ... не распознается как файл изображения любого типа, и ссылка на него не указана.

Результатом, возвращаемым на бэкэнд, является огромный json объект со следующими полями:

"selfLink": "https://www.googleapis.com/storage/v1/b/assertivesolutions2.appspot.com/o/upload_64e8fd09f787acfe2728ae73158e20ab"
"mediaLink": "https://storage.googleapis.com/download/storage/v1/b/assertivesolutions2.appspot.com/o/upload_64e8fd09f787acfe2728ae73158e20ab?generation=1590547279565389&alt=media"

Первый отправляет меня на страницу, на которой написано:

{
  "error": {
    "code": 401,
    "message": "Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object.",
    "errors": [
      {
        "message": "Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object.",
        "domain": "global",
        "reason": "required",
        "locationType": "header",
        "location": "Authorization"
      }
    ]
  }
}

Второй дает мне нечто похожее:

Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object.

Правила для моего сегмента хранилища следующие:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if true;
    }
  }
}

Я разрешаю все операции чтения и записи.

Так почему же он говорит, что у меня нет доступа к моему изображению, когда оно загружено через мой внутренний сервер?

Я также хотел бы знать, почему он не распознает его как jpeg при загрузке через мой внутренний сервер, но это происходит при загрузке через пользовательский интерфейс, но я хотел бы сосредоточиться на проблеме доступа в этом вопросе.

Спасибо.

1 Ответ

1 голос
/ 27 мая 2020

По умолчанию файлы выгружаются как частные, если вы не измените настройки корзины, как указано здесь . Приведенный ниже код является примером того, как изменить видимость ваших документов.

/**
 * {@inheritdoc}
 */
public function setVisibility($path, $visibility)
{
    $object = $this->getObject($path);

    if ($visibility === AdapterInterface::VISIBILITY_PRIVATE) {
        $object->acl()->delete('allUsers');
    } elseif ($visibility === AdapterInterface::VISIBILITY_PUBLIC) {
        $object->acl()->add('allUsers', Acl::ROLE_READER);
    }

    $normalised = $this->normaliseObject($object);
    $normalised['visibility'] = $visibility;

    return $normalised;
}

Вы можете проверить, как установить это через консоль, следуя руководству в официальной документации: Создание публикации данных c

Кроме того, как указано в комментарии @FrankvanPuffelen, у вас не будет сгенерированного URL-адреса для доступа к файлу. Вы можете найти более подробную информацию об этом здесь .

Сообщите мне, помогла ли вам эта информация!

...