2017-05-31 44 views
5

Kod:Firebase Przechowywanie/Bucket przesyłanie publicznych z node.js

var storage = require('@google-cloud/storage'); 
var gcs = storage({ 
    projectId: config.google.projectId, 
    keyFilename: config.google.keyFilenameFirebase 
}); 

var bucket = gcs.bucket('project-id.appspot.com'); 
var destination = 'uploads/12345/full.jpg'; 

bucket.upload(myFile, { public: true, destination: destination }, function(err, file) { 
    if (err) { 
     console.log(err); 
    } 
}); 

Mój plik został pomyślnie przesłany do mojego Firebase przechowywania, ale:

  1. Plik jest teraz publicznie dostępne za pośrednictwem adresu URL: https://storage.googleapis.com/project-id.appspot.com/uploads/12345/full.jpg. Czy mogę użyć tego stałego adresu URL w mojej aplikacji lub jest prawdopodobne, że zmieni się lub wygaśnie?
  2. public: true wydaje się przełamać Firebase Storage UI:

enter image description here podgląd obrazu po prawej stronie nie jest widoczna i jestem w stanie pobrać obraz za pomocą przycisku pobierania. Ponadto, brak jest pobieranie url (co nie przeszkadza, bo mogę do niego dostęp za pośrednictwem linku powyżej) i po kliknięciu „Utwórz nowy plik URL” Firebase daje

Błąd pobierania generujący URL

Po usunięciu public: true podgląd jest wyświetlany poprawnie i mogę również wygenerować adres URL do pobrania. Ale publiczny adres URL https://storage.googleapis.com/project-id.appspot.com/uploads/12345/full.jpg nie będzie już działał, co jest mi niezbędne.

Tak więc moim planem jest pozostać przy public: true, ale nadal mnie to niepokoi, że przycisk podglądu/pobierania nie działa i wygląda na to, że mam w Firebase błąd. Czy ktoś może to potwierdzić?

Odpowiedz

4

1) Nie wygasa, o ile jest zawsze publiczna. (Dodałem link do tego na dole)

2) Oto szybkie rozwiązanie. (Można wykonać jedną z poniższych)

  • Dodaj się w domyślny ACL (poniżej jest polecenie używając gsutil)

gsutil defacl ch -u your_email @ poczta.com: OWNER gs: // your_bucket;

  • dodać siebie jako Storage Administrator w konsoli administracyjnej Google IAM

Następnie reupload pliku ....

TL; DR

Oto powód Dlatego, zgodnie z Firebase Documentation:

Możesz używać interfejsów API Google Cloud Storage, aby uzyskać dostęp do plików przesłanych za pomocą pakietów SDK Firebase do Cloud Storage, w szczególności do wykonywania bardziej złożonych operacji , takich jak kopiowanie lub przenoszenie plików, lub do wyświetlania wszystkich plików dostępnych w pliku referencyjnym.

Należy pamiętać, że te żądania korzystają z list ACL Google Cloud Storage lub IAM poziomu projektu, a nie z uwierzytelniania Firebase i zasad bezpieczeństwa pamięci masowej.

Jeśli chodzi o public:true, to myślę, że to umożliwi i utworzy link publiczny. Patrz here

2

Twoje adresy URL nie powinny się zmieniać ani wygasać i powinny być ważne do odwołania, co może nastąpić w wyniku aktualizacji obiektu lub bezpośrednio poprzez anulowanie adresu URL w konsoli internetowej Firebase. Przynajmniej według mojej najlepszej wiedzy.

Pierwsza rzecz, która przychodzi mi do głowy to: czy skonfigurowałeś CORS na wiadrze? To może być jeden z powodów. Check this out

Drugą rzeczą, o której mogę pomyśleć, są zasady przechowywania. Jeśli masz coś w stylu: allow read: if request.auth.uid == userId;, możesz je usunąć, aby pliki były publicznie dostępne. Można użyć czegoś takiego, aby wszystkie pliki w publicznych ścieżki:

service firebase.storage { 
    match /b/XXXXXX.appspot.com/o { 
    match /{allPaths=**} { 
     allow read; 
    } 
    } 

Jeśli już zrobić te dwie rzeczy, to niestety może to być rzeczywiście Firebase bug też. Powodzenia!

+0

jestem już w kontakcie z Firebase tech zespołu. – Chris