Firebase adalah platform pengembangan aplikasi mobile dan web yang dimiliki oleh Google. Firebase menyediakan berbagai layanan dan alat untuk membantu pengembang dalam membuat, mengelola, dan mengoptimalkan aplikasi. Berikut adalah beberapa fitur utama Firebase:
Authentication (Autentikasi): Firebase menyediakan layanan otentikasi pengguna yang mudah digunakan. Pengembang dapat mengimplementasikan otentikasi email/password, otentikasi pihak ketiga (Google, Facebook, Twitter, dll.), dan metode otentikasi lainnya.
Realtime Database: Database Firebase adalah database NoSQL yang dapat diakses secara real-time. Ini memungkinkan aplikasi untuk menyinkronkan data secara instan antara pengguna dan perangkat.
Cloud Firestore: Firestore adalah database Firebase yang memungkinkan penyimpanan dan pengambilan data dalam waktu nyata. Firestore memiliki fleksibilitas yang tinggi dan mendukung struktur data yang kaya.
Storage: Firebase Storage menyediakan penyimpanan awan yang dapat digunakan untuk menyimpan dan mengambil file seperti gambar, video, dan dokumen.
Hosting: Firebase Hosting memungkinkan pengembang untuk dengan mudah meng-host situs web statis mereka. Ini menyediakan HTTPS gratis, caching cepat, dan integrasi yang mulus dengan alat Firebase lainnya.
Cloud Functions: Firebase Cloud Functions memungkinkan pengembang menulis dan menyematkan potongan kode ke dalam aplikasi mereka yang dijalankan secara otomatis sebagai respons terhadap peristiwa tertentu.
Cloud Messaging (FCM): Firebase Cloud Messaging menyediakan layanan pemberitahuan push untuk aplikasi Android, iOS, dan web.
Machine Learning: Firebase menyertakan fungsi pembelajaran mesin dengan ML Kit, yang memungkinkan integrasi mudah fitur pembelajaran mesin seperti pengenalan gambar, deteksi teks, dan lainnya.
Yang akan kita gunakan disini yaitu:
Firebase Authentication: Hanya user ter-autentikasi yang bisa upload dan delete file
Firebase Realtime Database: Untuk menyimpan data file yang sudah kita upload
Firebase Storage: Untuk menyimpan file yang akan kita upload. (Sparks plan atau Free Plan hanya diberi 1GB storage)
Firebase Hosting: Jika kamu ingin host website sederhana ini di Firebase.
Disini kita akan menggunakan local file saja tidak di upload ke hosting
Membuat Project dan Mendapatkan API Key
Sebelum kita membuat website upload nya kita perlu membuat project di Firebase terlebih dahulu.
rules_version = '2';service firebase.storage {match /b/{bucket}/o {match /images/{allPaths=**} {allow read:if true; // Allow read for everyoneallow write:if request.auth != null &&request.auth.uid == 'UID' && // Ganti dengan UID USER YANG SUDAH DIBUATrequest.resource.size < 5 * 1024 * 1024 &&request.resource.contentType.matches('image/.*');allow delete:if request.auth != null && request.auth.uid == '123456'; // Ganti dengan UID USER YANG SUDAH DIBUAT}match /videos/{allPaths=**} {allow read:if true; // Allow read for everyoneallow write:if request.auth != null &&request.auth.uid == '123456' && // Ganti dengan UID USER YANG SUDAH DIBUATrequest.resource.size < 5 * 1024 * 1024 &&request.resource.contentType.matches('video/mp4');allow delete:if request.auth != null && request.auth.uid == '123456'; // Ganti dengan UID USER YANG SUDAH DIBUAT}// Add rules for other folders or paths if needed// Default rule (if no other rule matches)match /{allPaths=**} {allow read:if true; // Allow read for everyoneallow write, delete:if false;}}}
Pada rules diatas, hanya UID 123456 yang bisa upload dan delete (write) files sedangkan yang lainnya hanya bisa read saja, hanya bisa upload format image dan video hanya bisa format mp4
Membuat Realtime Database
Klik pada menu Build dan pilih Realtime Database
Klik Create Database
Pada Realtime Database location, Pilih negara Singapore lalu Next
Pilih saja Start in locked mode lalu Enable
kamu copy dan simpan Realtime Database URL nya
Masuk ke tab Rules dan masukan kode berikut lalu klik pada button Publish
Copy dan pastekan kode berikut ke config.js. Pada firebaseConfig ganti dengan config yang kamu dapatkan di langkah 9 pada Membuat Project dan Mendapatkan API Key
config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Ganti value nya dengan config kamu masing-masing
constfirebaseConfig={apiKey:"AIzaSyBhW6y8EfqKYUyP7Di4NZ8TmbhTxQnS5eg",authDomain:"fir-upload-86d92.firebaseapp.com",databaseURL:"https://fir-upload-86d92-default-rtdb.asia-southeast1.firebasedatabase.app",projectId:"fir-upload-86d92",storageBucket:"fir-upload-86d92.appspot.com",messagingSenderId:"531276002779",appId:"1:531276002779:web:b14a763ec93a1569b1a3fe"};// Inisialisasi Firebase
firebase.initializeApp(firebaseConfig);// Memanggil layanan firebase yang akan kita gunakan
constauth=firebase.auth();conststorage=firebase.storage();constdatabase=firebase.database();
Copy dan pastekan code berikut ke copyToClipboard.js
// Setelah menginisialisasi Firebase
constclipboard=newClipboardJS('#copyToClipboardBtn');// Tambahkan event listener untuk melihat success atau error saat menyalin
clipboard.on('success',function(e){console.log('Teks berhasil disalin ke clipboard:',e.text);e.clearSelection();});clipboard.on('error',function(e){console.error('Kesalahan menyalin teks ke clipboard:',e.trigger);});// Fungsi untuk menyalin tautan ke clipboard
functioncopyToClipboard(element){constfullLink=element.href;// Buat element input sementara
consttempInput=document.createElement('input');tempInput.value=fullLink;document.body.appendChild(tempInput);// Pilih dan salin teks
tempInput.select();document.execCommand('copy');// Hapus element input sementara
document.body.removeChild(tempInput);// Tampilkan pesan di console (opsional)
console.log('Tautan disalin ke clipboard:',fullLink);}
letfileUploadProgress=0;functionuploadFile(){constfileInput=document.getElementById('fileInput');constfile=fileInput.files[0];if(file){letcustomFolder='';// Periksa jenis file dan atur folder khusus sesuai dengan file yang di upload
// Gambar akan diupload ke folder *images* sedangkan mp4 di folder *videos*
if(file.type.startsWith('image/')){customFolder='images';}elseif(file.type==='video/mp4'){customFolder='videos';}else{console.error('Jenis file tidak didukung!');return;}conststorageRef=storage.ref();constfileRef=storageRef.child(`${customFolder}/${file.name}`);// Unggah file ke Firebase Storage
constuploadTask=fileRef.put(file);// Perbarui progressbar
uploadTask.on('state_changed',(snapshot)=>{constprogress=(snapshot.bytesTransferred/snapshot.totalBytes)*100;updateProgressBar(progress);},(error)=>{console.error('Error mengunggah file:',error);},()=>{// Unggah berhasil
fileRef.getDownloadURL().then((downloadURL)=>{console.log('File berhasil diunggah!');// Tambahkan informasi file ke Realtime Database
constdatabase=firebase.database();constfilesRef=database.ref('uploadedFiles');// Buat unique key untuk file
constfileKey=filesRef.push().key;// data file yang disimpan di database
constfileData={name:file.name,type:file.type,downloadURL:downloadURL,timestamp:firebase.database.ServerValue.TIMESTAMP,};// Tambahkan data file ke database
filesRef.child(fileKey).set(fileData);// Tampilkan gambar atau video yang diunggah
if(file.type.startsWith('image/')){constuploadedImage=document.getElementById('uploadedImage');uploadedImage.src=downloadURL;uploadedImage.style.display='block';}elseif(file.type==='video/mp4'){// Tangani tampilan video jika diperlukan
}// Menampilkan direct link pada file yang di upload
document.getElementById('downloadLink').href=downloadURL;document.getElementById('downloadLink').innerText=downloadURL;document.getElementById('fileLink').style.display='block';// Reset proggress bar
updateProgressBar(0);// Tampilkan tombol "Salin ke Clipboard"
constcopyToClipboardBtn=document.getElementById('copyToClipboardBtn');copyToClipboardBtn.style.display='block';});});}else{console.error('Tidak ada file yang dipilih!');}}
Copy dan pastekan kode berikut ke updateProgressBar.js
functionlistUploadedFiles(){constfilesList=document.getElementById('filesList');// Dapatkan data dari folder 'images' dan 'videos' di firebase storage
constimagesFolder='images';constvideosFolder='videos';constimagesRef=storage.ref(imagesFolder);constvideosRef=storage.ref(videosFolder);// Fungsi untuk list file yang sudah kita upload
constaddFileToList=async(fileRef,folder)=>{// daftar grup untuk setiap file
constlistItem=document.createElement('li');listItem.className='list-group-item';// Tampilkan nama file dan buat thumbnail untuk gambar
if(fileRef.name.match(/\.(jpg|jpeg|png|gif)$/i)){try{constthumbnailUrl=awaitfileRef.getDownloadURL();constthumbnailImage=document.createElement('img');thumbnailImage.src=thumbnailUrl;thumbnailImage.className='img-fluid';thumbnailImage.style.maxHeight='80px';thumbnailImage.style.marginRight='10px';thumbnailImage.style.borderRadius='8px';listItem.appendChild(thumbnailImage);}catch(error){console.error('Error mendapatkan Thumbnail URL:',error);}}// Buat direct link untuk file
constfileLink=document.createElement('a');fileLink.href=awaitfileRef.getDownloadURL();fileLink.target='_blank';fileLink.innerText=fileRef.name;// Tampilkan nama file sebagai konten teks
// Buat atribut khusus ke tautan untuk mengidentifikasinya nanti
fileLink.setAttribute('data-filepath',fileRef.fullPath);// Buat tombol "Copy to Clipboard"
constcopyButton=document.createElement('button');copyButton.className='btn btn-info ms-3';copyButton.innerText='Copy to Clipboard';copyButton.addEventListener('click',()=>copyToClipboard(fileLink));// Buat tombol hapus
constdeleteButton=document.createElement('button');deleteButton.className='btn btn-danger ms-3';deleteButton.innerText='Delete';deleteButton.addEventListener('click',()=>deleteFile(fileLink));// Buat link, copy code, dan delete button
listItem.appendChild(fileLink);listItem.appendChild(copyButton);listItem.appendChild(deleteButton);// List files
filesList.appendChild(listItem);};// Daftar semua item di folder 'images'
imagesRef.listAll().then((imagesResult)=>{imagesResult.items.forEach(async(imageRef)=>{awaitaddFileToList(imageRef,imagesFolder);});}).catch((error)=>{console.error(`Error listing files in folder ${imagesFolder}:`,error);});// Daftar semua item di folder 'videos'
videosRef.listAll().then((videosResult)=>{videosResult.items.forEach(async(videoRef)=>{awaitaddFileToList(videoRef,videosFolder);});}).catch((error)=>{console.error(`Error listing files in folder ${videosFolder}:`,error);});}
functiondeleteFile(fileLink){// Dapatkan nilai atribut khusus untuk mengidentifikasi tautan
constfilePath=fileLink.getAttribute('data-filepath');// Referensi ke file di penyimpanan
constfileRef=storage.ref(filePath);// Hapus file dari penyimpanan
fileRef.delete().then(()=>{console.log('File berhasil dihapus dari penyimpanan!');// Hapus file dari Realtime Database
constdatabase=firebase.database();constfilesRef=database.ref('uploadedFiles');// Temukan data file di database berdasarkan path file
filesRef.orderByChild('downloadURL').equalTo(fileLink.href).once('value',(snapshot)=>{snapshot.forEach((childSnapshot)=>{// Hapus data file dari database
filesRef.child(childSnapshot.key).remove().then(()=>{console.log('Data file berhasil dihapus dari database!');}).catch((error)=>{console.error('Error menghapus data file dari database:',error);});});});// Hapus file dari daftar yang ditampilkan
constlistItem=fileLink.parentElement;if(listItem){listItem.remove();}else{console.error('Elemen daftar tidak ditemukan untuk dihapus.');}}).catch((error)=>{console.error('Error menghapus file dari penyimpanan:',error);});}
auth.onAuthStateChanged(user=>{if(user){document.getElementById('login').style.display='none';document.getElementById('upload').style.display='block';document.getElementById('fileList').style.display='block';// Tampilkan bagian daftar file
listUploadedFiles();// Menampilkan daftar file yang diunggah saat sudah ter-authentikasi
}else{document.getElementById('login').style.display='block';document.getElementById('upload').style.display='none';document.getElementById('fileList').style.display='none';// Sembunyikan bagian daftar file
}});functionhandleKeyPress(event,action){if(event.key==='Enter'){event.preventDefault();if(action==='login'){login();}}}functionlogin(){constemailInput=document.getElementById('emailInput').value;constpasswordInput=document.getElementById('passwordInput').value;// Login menggunakan email dan password
auth.signInWithEmailAndPassword(emailInput,passwordInput).catch(error=>{console.error('Error saat login:',error);});// Code ini bisa dihapus karena menampilkan password di console
console.log('Email:',emailInput);console.log('Password:',passwordInput);}functionlogout(){auth.signOut();clearDisplay();}functionclearDisplay(){// Hide element ketika logout
document.getElementById('uploadProgressBarContainer').style.display='none';document.getElementById('uploadStatus').innerText='';document.getElementById('uploadedImage').style.display='none';document.getElementById('fileList').style.display='none';document.getElementById('fileLink').style.display='none';document.getElementById('copyToClipboardBtn').style.display='none';// Bersihkan daftar file
constfilesList=document.getElementById('filesList');while(filesList.firstChild){filesList.removeChild(filesList.firstChild);}}
Test website secara local
Karena ini static website jadinya kita bisa menjalankannya secara lokal, tidak perlu server hanya memerlukan browser versi terbaru saja.
Buka index.html pada browser kamu
Login dengan Email/Password yang sudah dibuat dilangkah 6 pada Membuat User
Kamu coba untuk upload file dengan cara klik Choose File dan setelah itu klik Upload File
Jika berhasil maka akan tampil seperti ini
Cek firebase storage folder images
Cek juga database nya
Coba delete file yang sudah diupload
Itulah tutorial Langkah Mudah Membuat Website Upload Sederhana dengan Firebase, jika kamu ingin membuat website ini bisa diakses, kamu bisa deploy ke firebase hosting.