Setelah mengupload file di Firebase Storage dengan Functions for Firebase, saya ingin mendapatkan url download dari file tersebut.
Aku punya ini :
...
return bucket
.upload(fromFilePath, {destination: toFilePath})
.then((err, file) => {
// Get the download url of file
});
File objek memiliki banyak parameter. Bahkan satu nama mediaLink
. Namun, jika saya mencoba mengakses tautan ini, saya mendapatkan kesalahan ini:
Pengguna anonim tidak memiliki storage.objects. dapatkan akses ke objek ...
Adakah yang bisa memberi tahu saya cara mendapatkan Url unduhan publik?
Terima kasih
Jawaban:
Anda harus membuat URL yang ditandatangani menggunakan getSignedURL melalui modul NPM @ google-cloud / storage .
Contoh:
Anda harus menginisialisasi
@google-cloud/storage
dengan kredensial akun layanan Anda karena kredensial default aplikasi tidak akan cukup.UPDATE : Cloud Storage SDK sekarang dapat diakses melalui Firebase Admin SDK, yang bertindak sebagai pembungkus di sekitar @ google-cloud / storage. Satu-satunya cara adalah jika Anda:
sumber
action
danexpires
?Berikut adalah contoh tentang cara menentukan token unduhan saat mengunggah:
lalu telepon dengan
Kuncinya di sini adalah ada
metadata
objek yang bersarang di dalammetadata
properti opsi. MenyetelfirebaseStorageDownloadTokens
ke nilai uuid-v4 akan memberi tahu Cloud Storage untuk menggunakannya sebagai token autentikasi publiknya.Terima kasih banyak kepada @martemorfosis
sumber
Jawaban ini akan merangkum opsi untuk mendapatkan URL download saat mengupload file ke Google / Firebase Cloud Storage. Ada tiga jenis URL unduhan:
Ada tiga cara untuk mendapatkan URL unduhan token. Dua URL unduhan lainnya hanya memiliki satu cara untuk mendapatkannya.
Dari Konsol Penyimpanan Firebase
Anda bisa mendapatkan URL download dari Firebase Storage console:
URL unduhan terlihat seperti ini:
Bagian pertama adalah jalur standar ke file Anda. Pada akhirnya adalah tanda. URL unduhan ini bersifat permanen, yaitu tidak akan kedaluwarsa, meskipun Anda dapat mencabutnya.
getDownloadURL () Dari Front End
The dokumentasi memberitahu kita untuk menggunakan
getDownloadURL()
:Ini mendapatkan URL unduhan yang sama yang bisa Anda dapatkan dari konsol Firebase Storage. Metode ini mudah tetapi mengharuskan Anda mengetahui jalur ke file Anda, yang dalam aplikasi saya berisi sekitar 300 baris kode, untuk struktur database yang relatif sederhana. Jika database Anda rumit, ini akan menjadi mimpi buruk. Dan Anda dapat mengunggah file dari ujung depan, tetapi ini akan mengekspos kredensial Anda kepada siapa pun yang mengunduh aplikasi Anda. Jadi untuk sebagian besar proyek, Anda pasti ingin mengunggah file Anda dari Node back end atau Google Cloud Functions, lalu dapatkan URL unduhan dan simpan ke database Anda bersama dengan data lain tentang file Anda.
getSignedUrl () untuk URL Unduhan Sementara
getSignedUrl () mudah digunakan dari back end Node atau Google Cloud Functions:
URL unduhan yang ditandatangani terlihat seperti ini:
URL yang ditandatangani memiliki tanggal kedaluwarsa dan tanda tangan yang panjang. Dokumentasi untuk baris perintah gsutil signurl -d mengatakan bahwa URL bertanda tangan bersifat sementara: masa berlaku default adalah satu jam dan masa berakhir maksimum adalah tujuh hari.
Saya akan mengomel di sini bahwa getSignedUrl tidak pernah mengatakan bahwa URL Anda yang ditandatangani akan kedaluwarsa dalam seminggu. Kode dokumentasi memiliki
3-17-2025
tanggal kedaluwarsa, yang menyarankan agar Anda dapat mengatur tahun kedaluwarsa di masa mendatang. Aplikasi saya bekerja dengan sempurna, lalu mogok seminggu kemudian. Pesan kesalahan mengatakan bahwa tanda tangan tidak cocok, bukan bahwa URL unduhan telah kedaluwarsa. Saya membuat berbagai perubahan pada kode saya, dan semuanya bekerja ... sampai semuanya macet seminggu kemudian. Ini berlangsung selama lebih dari sebulan karena frustrasi.Buat File Anda Tersedia untuk Publik
Anda dapat mengatur izin pada file Anda untuk dibaca publik, seperti yang dijelaskan dalam dokumentasi . Ini dapat dilakukan dari Cloud Storage Browser atau dari server Node Anda. Anda dapat membuat satu file menjadi publik atau direktori atau seluruh database Storage Anda. Inilah kode Node:
Hasilnya akan terlihat seperti ini di Cloud Storage Browser Anda:
Siapa pun kemudian dapat menggunakan jalur standar untuk mengunduh file Anda:
Cara lain untuk membuat file menjadi publik adalah dengan menggunakan metode makePublic () . Saya belum bisa membuatnya berfungsi, sulit untuk mendapatkan bucket dan jalur file yang benar.
Alternatif yang menarik adalah dengan menggunakan Daftar Kontrol Akses . Anda dapat membuat file tersedia hanya untuk pengguna yang Anda masukkan ke dalam daftar, atau gunakan
authenticatedRead
untuk membuat file tersedia bagi siapa saja yang masuk dari akun Google. Jika ada opsi "siapa saja yang login ke aplikasi saya menggunakan Firebase Auth", saya akan menggunakan ini, karena akan membatasi akses hanya untuk pengguna saya.Buat URL Download Anda Sendiri dengan firebaseStorageDownloadTokens
Beberapa jawaban mendeskripsikan properti objek Google Storage yang tidak terdokumentasi
firebaseStorageDownloadTokens
. Dengan ini, Anda dapat memberi tahu Storage, token yang ingin Anda gunakan. Anda dapat membuat token denganuuid
modul Node. Empat baris kode dan Anda dapat membuat URL unduhan Anda sendiri, URL unduhan yang sama yang Anda dapatkan dari konsol ataugetDownloadURL()
. Empat baris kode tersebut adalah:Berikut kode dalam konteks:
Itu bukan kesalahan ketik - Anda harus membuat
firebaseStorageDownloadTokens
lapisan gandametadata:
!Doug Stevenson menunjukkan bahwa
firebaseStorageDownloadTokens
itu bukan fitur Google Cloud Storage resmi. Anda tidak akan menemukannya di dokumentasi Google mana pun, dan tidak ada janji akan menemukannya di versi mendatang@google-cloud
. Saya sukafirebaseStorageDownloadTokens
karena itu satu-satunya cara untuk mendapatkan apa yang saya inginkan, tetapi memiliki "bau" yang tidak aman digunakan.Mengapa Tidak Ada getDownloadURL () dari Node?
Seperti yang ditulis @Clinton, Google harus membuat
file.getDownloadURL()
metode di@google-cloud/storage
(yaitu, ujung belakang Node Anda). Saya ingin mengupload file dari Google Cloud Functions dan mendapatkan URL download token.sumber
@google-cloud/storage
hal ini, silakan berifirebaseStorageDownloadTokens
tidak berfungsi lagi.Dengan perubahan terbaru dalam respons objek fungsi, Anda bisa mendapatkan semua yang Anda butuhkan untuk "menyatukan" URL unduhan seperti:
sumber
bucket.file().upload()
? Saya tidak menerima properti metadata apa pun dalam data respons, dan saya tidak yakin bagaimana mendapatkannyafirebaseStorageDownloadTokens
.bucket.name
, Anda tidak perlu melakukan hardcode atau menggunakan var lokal tambahanmetadata.mediaLink
properti mencegah masalah seperti itu.Jika Anda sedang mengerjakan proyek Firebase, Anda dapat membuat URL yang ditandatangani di Cloud Function tanpa menyertakan pustaka lain atau mengunduh file kredensial. Anda hanya perlu mengaktifkan IAM API dan menambahkan peran ke akun layanan Anda yang ada (lihat di bawah).
Inisialisasi perpustakaan admin dan dapatkan referensi file seperti yang biasa Anda lakukan:
Anda kemudian membuat URL yang ditandatangani dengan
Pastikan akun layanan Firebase Anda memiliki izin yang memadai untuk menjalankan ini
Dengan konfigurasi Firebase vanilla, pertama kali Anda menjalankan kode di atas, Anda akan mendapatkan kesalahan Identity and Access Management (IAM) API belum pernah digunakan dalam proyek XXXXXX sebelumnya atau dinonaktifkan. . Jika Anda mengikuti tautan dalam pesan kesalahan dan mengaktifkan IAM API, Anda akan mendapatkan kesalahan lain: Izin iam.serviceAccounts.signBlob diperlukan untuk melakukan operasi ini pada akun layanan my-service-account . Menambahkan peran Token Creator memperbaiki masalah izin kedua ini.
sumber
Salah satu metode yang saya gunakan dengan sukses adalah dengan menetapkan nilai UUID v4 ke kunci yang dinamai
firebaseStorageDownloadTokens
dalam metadata file setelah selesai mengupload dan kemudian menyusun sendiri URL download mengikuti struktur yang digunakan Firebase untuk menghasilkan URL ini, misalnya:Saya tidak tahu seberapa "aman" menggunakan metode ini (mengingat Firebase dapat mengubah cara menghasilkan URL unduhan di masa mendatang) tetapi mudah untuk diterapkan.
sumber
Bagi mereka yang bertanya-tanya ke mana file Firebase Admin SDK serviceAccountKey.json harus disimpan. Letakkan saja di folder fungsi dan terapkan seperti biasa.
Saya masih bingung mengapa kita tidak bisa begitu saja mendapatkan url unduhan dari metadata seperti yang kita lakukan di Javascript SDK. Membuat url yang pada akhirnya akan kedaluwarsa dan menyimpannya dalam database tidak diinginkan.
sumber
Saya sarankan menggunakan opsi
predefinedAcl: 'publicRead'
saat mengupload file dengan Cloud Storage NodeJS 1.6.x atau +:Kemudian, mendapatkan URL publik itu semudah:
sumber
Maaf tetapi saya tidak dapat mengirim komentar untuk pertanyaan Anda di atas karena reputasi yang hilang, jadi saya akan memasukkannya dalam jawaban ini.
Lakukan seperti yang dinyatakan di atas dengan membuat Url yang ditandatangani, tetapi alih-alih menggunakan service-account.json, saya pikir Anda harus menggunakan serviceAccountKey.json yang dapat Anda hasilkan di (ganti PROJECTID ANDA sesuai)
https://console.firebase.google.com/project/YOURPROJECTID/settings/serviceaccounts/adminsdk
Contoh:
sumber
Saya tidak bisa mengomentari jawaban yang James Daniels berikan, tapi saya rasa ini sangat penting untuk dibaca.
Memberikan URL yang ditandatangani Seperti yang dia lakukan dalam banyak kasus tampaknya sangat buruk dan mungkin Berbahaya . Menurut dokumentasi Firebase, url yang ditandatangani akan kedaluwarsa setelah beberapa waktu, jadi menambahkannya ke databse Anda akan menyebabkan url kosong setelah jangka waktu tertentu.
Mungkin karena salah memahami Dokumentasi di sana dan url yang ditandatangani tidak kedaluwarsa, yang akan menyebabkan beberapa masalah keamanan. Kunci tampaknya sama untuk setiap file yang diunggah. Ini berarti begitu Anda mendapatkan url dari satu file, seseorang dapat dengan mudah mengakses file yang seharusnya tidak dia akses, hanya dengan mengetahui namanya.
Jika saya salah paham maka saya akan lvoe untuk dikoreksi. Orang lain mungkin harus memperbarui solusi bernama di atas. Jika saya mungkin salah di sana
sumber
Inilah yang saya gunakan saat ini, sederhana dan berfungsi dengan sempurna.
Anda tidak perlu melakukan apa pun dengan Google Cloud. Ini berfungsi di luar kotak dengan Firebase ..
EDIT: Contoh yang sama, tetapi dengan unggahan:
memperbarui:
tidak perlu melakukan dua panggilan berbeda dalam metode unggah untuk mendapatkan metadata:
sumber
Saya memiliki masalah yang sama, namun, saya melihat kode contoh fungsi firebase, bukan README. Dan Jawaban di utas ini juga tidak membantu ...
Anda dapat menghindari meneruskan file konfigurasi dengan melakukan hal berikut:
sumber: Secara otomatis menghasilkan fungsi Gambar Mini README
Peran Anda untuk mesin aplikasi akan terlihat seperti ini:
sumber
Jika Anda menggunakan nilai daftar kontrol akses yang telah ditentukan sebelumnya dari 'publicRead', Anda dapat mengunggah file dan mengaksesnya dengan struktur url yang sangat sederhana:
Anda kemudian dapat membuat url seperti ini:
sumber
Ini berfungsi jika Anda hanya membutuhkan file publik dengan URL sederhana. Perhatikan bahwa ini dapat mengesampingkan aturan penyimpanan Firebase Anda.
sumber
Bagi mereka yang menggunakan SDK Firebase dan
admin.initializeApp
:1 - Buat Kunci Pribadi dan tempatkan di folder / functions.
2 - Konfigurasi kode Anda sebagai berikut:
Dokumentasi
Coba / tangkap adalah karena saya menggunakan index.js yang mengimpor file lain dan membuat satu fungsi untuk setiap file. Jika Anda menggunakan satu file index.js dengan semua fungsi, Anda tidak masalah
admin.initializeApp(Object.assign(functions.config().firebase, { credential: admin.credential.cert(serviceAccount) }));
.sumber
Sejak firebase 6.0.0 saya dapat mengakses penyimpanan secara langsung dengan admin seperti ini:
Jadi saya tidak perlu menambahkan akun layanan. Kemudian menyetel UUID seperti yang dirujuk di atas berfungsi untuk mendapatkan url firebase.
sumber
Ini yang terbaik yang pernah saya lakukan. Itu mubazir, tetapi satu-satunya solusi yang masuk akal yang berhasil untuk saya.
sumber
Tanpa
signedURL()
menggunakanmakePublic()
sumber
jawaban oleh https://stackoverflow.com/users/269447/laurent bekerja paling baik
sumber
Jika Anda mendapatkan kesalahan:
coba ini:
sumber
Saya sudah memposting jawaban saya ... di bawah URL Dimana Anda bisa mendapatkan kode lengkap dengan solusi
Bagaimana cara mengupload gambar (string) berenkode base64 langsung ke keranjang Google Cloud Storage menggunakan Node.js?
sumber