Unggahan berkas berskala besar: validasi, penyimpanan, dan akses
Unggahan berkas berskala besar butuh validasi yang jelas, jalur penyimpanan rapi, tautan unduhan kedaluwarsa, dan izin kuat untuk melindungi berkas pengguna.

Apa yang membuat unggahan berkas pengguna sulit pada skala besar
Unggahan pengguna terasa sederhana dengan beberapa penguji. Menjadi rumit ketika orang nyata mulai mengirim berkas nyata: foto besar, PDF hasil scan, dan dokumen misterius dengan ekstensi yang salah. Pada titik itu, unggahan berkas pada skala besar berhenti menjadi tombol pada formulir dan berubah menjadi masalah keamanan dan operasi.
Retakan pertama biasanya muncul di tiga tempat: keamanan, biaya, dan privasi. Penyerang mencoba mengunggah malware, pengguna mengunggah berkas yang aplikasi Anda tidak bisa buka, dan tim secara tidak sengaja mengekspos dokumen sensitif melalui URL publik. Tagihan penyimpanan bertambah, begitu juga bandwidth saat berkas yang sama diunduh berulang kali.
Gambar dan PDF menimbulkan masalah yang berbeda. Gambar bisa sangat besar, datang dalam banyak format, dan sering menyertakan metadata tersembunyi (seperti lokasi). Anda juga butuh thumbnail dan pengubahan ukuran agar aplikasi tetap cepat. PDF rumit untuk dipreview dengan aman, bisa berisi konten tersemat, dan sering berisi catatan sensitif (faktur, KTP, kontrak) yang tidak boleh diakses secara luas.
Pada skala besar, biasanya Anda berhadapan dengan lebih banyak pengguna yang mengunggah sekaligus, berkas yang lebih besar dan total penyimpanan lebih banyak, lebih banyak unduhan dan retry dari jaringan yang tidak stabil, serta lebih banyak aturan: tim yang berbeda, peran, dan kebutuhan retensi.
Tujuannya bukan sekadar unggahan yang bekerja. Tujuannya adalah unggahan yang aman dan tetap mudah dikelola berbulan-bulan kemudian: aturan yang jelas, jalur penyimpanan yang dapat diprediksi, metadata yang ramah audit, dan kontrol akses yang sesuai dengan cara bisnis Anda benar-benar berbagi berkas.
Petakan jenis berkas dan siapa yang boleh mengaksesnya
Sebelum Anda mengatur penyimpanan atau keamanan, jelaskan apa yang akan diunggah orang dan siapa yang diizinkan melihatnya. Sebagian besar masalah unggahan pada skala besar sebenarnya bukan masalah penyimpanan. Mereka adalah harapan yang tidak cocok tentang akses, retensi, dan risiko.
Mulailah dengan membuat daftar kategori berkas nyata, bukan hanya dokumen dan gambar. Avatar berperilaku sangat berbeda dari PDF kontrak, dan screenshot dukungan berbeda dari laporan bulanan.
Salah satu cara praktis untuk memetakan unggahan adalah mengaitkan setiap kategori ke pola akses:
- Avatar dan gambar profil publik sering dapat dibaca banyak orang, dan hanya dapat diedit oleh pemiliknya.
- Struk dan faktur bersifat privat secara default, dibagikan hanya ke peran keuangan atau pemilik akun.
- Kontrak dan berkas kepatuhan sangat dibatasi dan sering membutuhkan jejak audit serta aturan retensi yang lebih ketat.
- Laporan dan ekspor dapat dibagikan dalam tim tetapi harus dibatasi ke workspace atau pelanggan yang tepat.
- Lampiran tiket biasanya privat untuk peserta tiket dan kadang bersifat terbatas waktu.
Lalu ambil snapshot risiko cepat. Unggahan bisa menyembunyikan malware, membocorkan data sensitif (ID, informasi bank, data medis), atau mengekspos izin yang rusak di mana menebak URL memberikan akses. Itulah mengapa unggahan berkas pada skala besar sama pentingnya soal kontrol akses berkas seperti halnya soal byte.
Performa juga penting. PDF besar, gambar resolusi tinggi, dan jaringan seluler yang fluktuatif menyebabkan unggahan parsial dan retry. Tentukan sejak awal unggahan mana yang harus berhasil dengan andal (faktur, ID) dan mana yang bersifat opsional (banner profil).
Untuk setiap jenis berkas, jawab beberapa pertanyaan lebih awal agar Anda tidak perlu menulis ulang nanti:
- Siapa yang bisa mengunggah, melihat, mengganti, dan menghapusnya?
- Apakah bersifat privat, dibagikan dalam grup, atau publik?
- Haruskah akses kedaluwarsa atau dapat dicabut langsung?
- Apa yang terjadi jika unggahan terputus dan diulang?
- Berapa lama Anda menyimpannya, dan siapa yang bisa mengekspornya?
Jika Anda membangun dengan alat seperti AppMaster, anggap jawaban-jawaban ini sebagai aturan produk terlebih dahulu, lalu terapkan di model data dan endpoint sehingga izin tetap konsisten di web dan mobile.
Aturan validasi unggahan berkas yang mencegah masalah sejak awal
Jika Anda ingin unggahan berkas pada skala besar tetap aman dan dapat diprediksi, validasi adalah garis pertahanan pertama. Aturan yang baik menghentikan berkas berbahaya sebelum mencapai penyimpanan, dan mengurangi tiket dukungan karena pengguna mendapat umpan balik yang jelas.
Mulailah dengan allowlist, bukan blocklist. Periksa ekstensi nama file dan juga verifikasi MIME type dari konten yang diunggah. Mengandalkan ekstensi saja mudah diakali. Mengandalkan MIME saja bisa tidak konsisten antar perangkat.
Batas ukuran harus sesuai dengan jenis berkas dan aturan produk Anda. Gambar mungkin oke pada 5–10 MB, sementara PDF mungkin butuh batas lebih tinggi. Video adalah masalah yang berbeda dan biasanya membutuhkan pipeline sendiri. Jika Anda punya tier berbayar, kaitkan batas ke paket sehingga Anda bisa mengatakan, “Paket Anda mengizinkan PDF sampai 10 MB,” daripada menampilkan kesalahan yang tidak jelas.
Beberapa berkas butuh pemeriksaan lebih dalam. Untuk gambar, validasi lebar dan tinggi (dan kadang rasio aspek) untuk menghindari unggahan raksasa yang memperlambat halaman. Untuk PDF, jumlah halaman bisa penting bila kasus penggunaan Anda mengharapkan rentang kecil.
Ganti nama file saat unggah. Nama file pengguna sering berisi spasi, emoji, atau nama berulang seperti scan.pdf. Gunakan ID yang dihasilkan plus ekstensi yang aman, dan simpan nama asli di metadata untuk ditampilkan.
Garis dasar validasi yang cocok untuk banyak aplikasi terlihat seperti ini:
- Allowlist tipe (ekstensi + MIME), tolak yang lain.
- Tetapkan ukuran maksimum per tipe (dan opsional per paket).
- Validasi dimensi gambar dan tolak ukuran ekstrem.
- Validasi jumlah halaman PDF bila kasus penggunaan Anda mengharapkannya.
- Ganti nama ke nama file unik dan aman dan simpan nama asli sebagai metadata.
Saat validasi gagal, tampilkan satu pesan jelas yang bisa ditindaklanjuti pengguna, seperti “PDF harus di bawah 20 MB dan maksimal 50 halaman.” Pada saat yang sama, catat detail teknis untuk admin (MIME terdeteksi, ukuran, user ID, dan alasan). Di AppMaster, pemeriksaan ini bisa hidup di Business Process sehingga setiap jalur unggahan mengikuti aturan yang sama.
Model data untuk unggahan dan metadata berkas
Model data yang baik membuat unggahan menjadi membosankan. Tujuannya adalah melacak siapa pemilik berkas, untuk apa, dan apakah aman digunakan, tanpa mengikat aplikasi Anda ke satu vendor penyimpanan.
Pola yang andal adalah alur dua langkah. Pertama, buat record unggahan di database dan kembalikan upload ID. Kedua, unggah binari ke penyimpanan menggunakan ID itu. Ini menghindari berkas misterius yang tersisa di bucket tanpa baris yang cocok, dan memungkinkan Anda menegakkan izin sebelum byte apa pun dipindahkan.
Tabel uploads sederhana (atau koleksi) biasanya cukup. Di AppMaster, ini dipetakan dengan rapi ke model PostgreSQL di Data Designer dan dapat dipakai di web dan aplikasi mobile.
Simpan apa yang benar-benar Anda perlukan nanti untuk dukungan dan audit:
- Referensi pemilik (
user_id) dan ruang lingkup (org_idatauteam_id) - Tujuan (avatar, invoice_pdf, ticket_attachment)
- Nama file asli, MIME type yang terdeteksi, dan
size_bytes - Penunjuk penyimpanan (bucket/container,
object_key) plus checksum (opsional) - Timestamp (
created_at,uploaded_at) dan IP/perangkat pengunggah (opsional)
Jaga model status kecil agar tetap terbaca. Empat status mencakup sebagian besar produk:
pending: record ada, unggahan belum selesaiuploaded: byte tersimpanverified: lulus pemeriksaan dan siap digunakanblocked: gagal pemeriksaan atau melanggar kebijakan
Rencanakan pembersihan sejak hari pertama. Unggahan pending yang ditinggalkan terjadi saat pengguna menutup tab atau kehilangan koneksi. Job harian dapat menghapus objek penyimpanan untuk baris pending yang kedaluwarsa, menandai baris sebagai dibatalkan untuk pelaporan, menghapus item blocked lama setelah jendela retensi, dan menyimpan berkas verified sampai aturan bisnis menentukan sebaliknya.
Model ini memberi Anda keterlacakan dan kontrol tanpa menambah kompleksitas.
Organisasi penyimpanan yang tetap rapi seiring waktu
Saat unggahan berkas pada skala besar mulai menumpuk, risiko terbesar bukan biaya penyimpanan. Itu adalah kekacauan. Jika tim Anda tidak bisa mengatakan apa sebuah berkas, siapa pemiliknya, dan apakah masih berlaku, Anda akan mengirim bug dan membocorkan data.
Pilih satu strategi folder yang dapat diprediksi dan patuhi. Banyak tim mengatur berdasarkan tenant (perusahaan), lalu berdasarkan tujuan, lalu berdasarkan tanggal. Lainnya melakukan tenant, user, tujuan. Pilihan tepatnya kurang penting daripada konsistensi. Tanggal membantu agar direktori tidak tumbuh tanpa batas dan memudahkan job pembersihan.
Hindari menaruh data pribadi di path atau nama file. Jangan sematkan alamat email, nama lengkap, nomor faktur, atau nomor telepon. Gunakan ID acak. Jika Anda perlu mencari berdasarkan makna manusia, simpan itu di metadata database, bukan di object key.
Pisahkan asli dan turunan agar aturan tetap jelas. Simpan unggahan asli sekali, dan simpan thumbnail atau preview di prefix yang berbeda. Ini memudahkan penerapan kebijakan retensi dan izin yang berbeda (preview mungkin boleh ditampilkan di lebih banyak tempat daripada asli).
Pendekatan penamaan yang sederhana dan tahan lama:
- Partisi berdasarkan tenant ID (atau workspace ID)
- Tambahkan prefix tujuan (avatars, invoices, attachments)
- Tambahkan bucket waktu (YYYY/MM)
- Gunakan file ID yang opak sebagai nama file
- Simpan turunan di prefix terpisah (previews, thumbnails)
Putuskan bagaimana Anda menangani versi. Jika pengguna bisa mengganti file, timpa object key yang sama (sederhana, tanpa riwayat) atau buat versi baru dan tandai yang lama sebagai tidak aktif (lebih ramah audit). Banyak tim menyimpan riwayat untuk dokumen kepatuhan dan menimpa untuk foto profil.
Tuliskan aturan penamaan Anda. Di AppMaster, perlakukan ini seperti konvensi bersama: simpan di dokumentasi proyek sehingga logika backend, pembuat UI, dan integrasi di masa depan semua menghasilkan jalur yang sama.
Pola izin dan kontrol akses
Dengan unggahan berkas pada skala besar, izin adalah tempat pintasan kecil berubah menjadi insiden besar. Mulailah dengan deny-by-default: setiap berkas yang diunggah bersifat privat sampai sebuah aturan secara eksplisit mengizinkan akses.
Membantu untuk memisahkan dua pertanyaan: siapa yang bisa melihat record, dan siapa yang bisa mengambil byte. Itu bukan hal yang sama. Banyak aplikasi harus membiarkan seseorang melihat metadata (nama file, ukuran, tanggal unggah) tanpa bisa men-download file.
Pola akses umum
Pilih satu pola utama per jenis berkas, lalu tambahkan pengecualian dengan hati-hati:
- Owner-only: hanya pengunggah (dan service account) yang bisa men-download.
- Team-based: anggota workspace/proyek bisa men-download.
- Role-based: peran seperti Finance atau HR bisa men-download di seluruh tim.
- Share-by-link: token khusus memberikan unduhan, biasanya dengan masa berlaku dan cakupan.
Kasus pinggiran butuh aturan jelas, bukan perbaikan sekali jalan. Tentukan bagaimana admin bekerja (akses global atau hanya kategori tertentu), bagaimana dukungan mendapat akses sementara (dibatasi waktu dan dicatat), dan apa yang terjadi saat pengguna dihapus (simpan berkas untuk kepatuhan, alihkan kepemilikan, atau hapus).
Perlakukan metadata dan unduhan secara terpisah
Polanya sederhana: dua pemeriksaan: (1) apakah pengguna bisa membaca record unggahan, (2) apakah pengguna bisa meminta respons unduhan. Pemeriksaan kedua inilah tempat Anda menerapkan “privat kecuali diizinkan,” bahkan jika seseorang menebak ID.
Untuk dokumen sensitif, catat akses. Setidaknya, rekam siapa yang mengunduh (user ID dan peran), apa yang diunduh (file ID dan tipe), kapan terjadi (timestamp), mengapa diizinkan (hasil kebijakan, token berbagi, override admin), dan dari mana asalnya (IP atau perangkat, jika relevan).
Di AppMaster, aturan ini sering hidup di Business Process Editor: satu alur untuk daftar metadata unggahan, dan alur yang lebih ketat untuk menghasilkan respons unduhan.
Tautan unduhan kedaluwarsa: unduhan lebih aman tanpa gesekan
Tautan unduhan yang kedaluwarsa adalah jalan tengah yang baik antara “siapa pun dengan URL bisa mengunduh selamanya” dan “pengguna harus login tiap kali.” Mereka bekerja baik untuk unduhan sekali, berbagi dokumen lewat email, atau memberi akses sementara ke kontraktor. Pada skala besar, mereka juga mengurangi masalah dukungan karena Anda bisa memberikan akses tanpa membuka seluruh penyimpanan.
Dua pola umum:
- Signed URLs kedaluwarsa otomatis. Mereka sederhana dan cepat, tetapi pencabutan sulit jika tautan sudah tersebar.
- Endpoint unduhan berbasis token memberi Anda kontrol lebih. Tautan berisi token singkat, aplikasi Anda memeriksa izin pada setiap permintaan, lalu menyajikan atau mengarahkan ke file.
Pengaturan praktis:
- Gunakan masa berlaku singkat untuk tautan berbagi (10 sampai 60 menit) dan perbarui sesuai permintaan.
- Simpan masa berlaku lebih panjang hanya untuk sesi yang tepercaya dan sudah login (mis. “Download again” menghasilkan tautan baru).
- Batas cakupan tautan ketat: satu berkas, satu pengguna (atau penerima), satu tindakan (lihat vs unduh).
- Catat pembuatan dan pemakaian tautan sehingga Anda bisa menelusuri kebocoran tanpa menebak.
Cakupan penting karena lihat biasanya berarti tampilan inline, sementara unduh berarti menyimpan salinan. Jika Anda butuh keduanya, buat tautan terpisah dengan aturan terpisah.
Rencanakan pencabutan. Jika pengguna kehilangan akses (refund, perubahan peran, kontrak berakhir), signed URLs saja mungkin tidak cukup. Dengan endpoint token, Anda bisa membatalkan token segera. Dengan signed URLs, pakai masa berlaku pendek dan rotasi kunci penandatanganan hanya bila perlu (rotasi kunci mencabut semuanya, jadi gunakan dengan hati-hati).
Contoh: tautan faktur di portal pelanggan yang dikirim ke akuntan kedaluwarsa dalam 30 menit, hanya memungkinkan view-only, dan terkait dengan ID faktur plus akun pelanggan. Jika pelanggan dihapus dari akun, token ditolak meskipun email diteruskan.
Langkah demi langkah: alur unggahan yang dapat diskalakan
Alur unggahan yang andal memisahkan tiga kekhawatiran: apa yang Anda izinkan, ke mana byte pergi, dan siapa yang bisa mengambilnya nanti. Ketika hal-hal itu bercampur, kasus pinggiran kecil berubah menjadi insiden produksi.
Alur praktis untuk gambar, PDF, dan sebagian besar berkas yang dibuat pengguna:
- Tetapkan aturan berbasis tujuan. Untuk setiap tujuan (avatar, invoice, dokumen ID), atur tipe yang diizinkan, ukuran maksimum, dan pemeriksaan ekstra seperti jumlah halaman.
- Buat permintaan unggahan di backend. Klien meminta izin mengunggah. Backend mengembalikan target unggahan (mis. object storage key plus token jangka pendek) dan membuat baris unggahan baru dengan status
pending. - Unggah byte ke penyimpanan, lalu konfirmasi. Klien mengunggah ke object storage, lalu memanggil backend untuk mengonfirmasi selesai. Backend memeriksa key yang diharapkan dan properti dasar, lalu menandai baris
uploaded. - Jalankan verifikasi asinkron. Di latar belakang, verifikasi tipe berkas yang sebenarnya (idealnya termasuk magic bytes), tegakkan ukuran, ekstrak metadata aman (dimensi, jumlah halaman), dan opsional jalankan scanning malware. Jika gagal, tandai unggahan
blockeddan cegah unduhan. - Sajikan unduhan melalui kebijakan. Saat unduhan, verifikasi pengguna memiliki akses ke entitas pemilik berkas (user, org, ticket, order). Lalu proxiedownload atau kembalikan tautan unduhan yang kedaluwarsa untuk menjaga penyimpanan privat.
Tambahkan pembersihan. Hapus unggahan pending yang ditinggalkan setelah jangka waktu singkat, dan hapus berkas yang tidak direferensikan (mis. pengguna mengunggah gambar tapi tidak menyimpan formulir).
Jika Anda membangun ini di AppMaster, modelkan unggahan sebagai entitas sendiri dengan field status dan referensi pemilik, lalu terapkan pengecekan izin yang sama di setiap Business Process unduhan.
Contoh: faktur di portal pelanggan
Portal pelanggan di mana pengguna mengunggah faktur sebagai PDF terdengar sederhana sampai Anda punya ribuan perusahaan, banyak peran, dan faktur yang sama diganti tiga kali.
Untuk organisasi penyimpanan, simpan berkas mentah di jalur yang dapat diprediksi dan sesuai cara orang mencari. Misalnya: invoices/\u003ccompany_id\u003e/\u003cyyyy-mm\u003e/\u003cupload_id\u003e.pdf. Company dan bulan memudahkan pembersihan dan pelaporan, sedangkan upload_id menghindari tabrakan ketika dua file memiliki nama sama.
Di database, simpan metadata yang menjelaskan apa berkas itu dan siapa yang bisa mengaksesnya:
company_iddanbilling_monthuploaded_by_user_iddanuploaded_atoriginal_filenamedancontent_typesize_bytesdan checksum (opsional)- status (active, replaced, quarantined)
Sekarang berbagi: manajer tagihan ingin mengirim satu faktur ke akuntan eksternal selama 24 jam. Alih-alih mengubah izin global, buat tautan unduhan yang kedaluwarsa terkait faktur spesifik itu, dengan waktu kedaluwarsa ketat dan tujuan tunggal (hanya unduh). Saat akuntan mengkliknya, aplikasi Anda memeriksa token, memastikan belum kedaluwarsa, lalu menyajikan file.
Jika pengguna mengunggah PDF yang salah atau mengganti file, jangan timpa objek lama. Tandai record sebelumnya sebagai replaced, simpan untuk audit, dan arahkan entri faktur ke upload_id yang baru. Jika Anda harus menghormati aturan retensi, Anda bisa menghapus file yang diganti nanti dengan job terjadwal.
Saat dukungan mendapat tiket “tidak bisa mengunduh”, metadata membantu mendiagnosis dengan cepat: apakah tautan kedaluwarsa, apakah faktur sudah ditandai replaced, apakah pengguna berada di perusahaan yang benar, atau apakah file ditandai quarantined? Di AppMaster, pengecekan ini bisa hidup di Business Process sehingga setiap unduhan mengikuti aturan yang sama.
Kesalahan umum dan cara menghindarinya
Saat tim pertama kali menangani unggahan berkas pada skala besar, bug jarang misterius. Mereka datang dari beberapa pintasan yang dapat diprediksi yang terlihat baik di demo tetapi menyakitkan nanti.
- Hanya mempercayai ekstensi file atau hanya MIME type. Penyerang bisa mengganti nama file, dan browser bisa berbohong. Periksa keduanya, dan juga verifikasi magic bytes di sisi server.
- Menggunakan penyimpanan publik dan mengandalkan izin cukup. Bucket/container publik mengubah setiap aturan yang terlewat menjadi kebocoran data. Jaga penyimpanan privat secara default dan kendalikan akses lewat aplikasi Anda.
- Menaruh nama yang diberikan pengguna di path atau URL penyimpanan. Nama seperti invoice_john_smith.pdf membocorkan info pribadi dan mempermudah penebakan. Gunakan ID acak untuk object key, simpan nama tampilan sebagai metadata.
- Mencampur berkas tenant dalam path yang sama tanpa pengecekan kuat. Path seperti /uploads/2026/01/ bukanlah model izin. Selalu verifikasi tenant dan hak pengguna sebelum mengembalikan unduhan.
- Melewatkan pembersihan untuk unggahan yang gagal atau ditinggalkan. Multi-part upload dan retry meninggalkan sampah. Tambahkan job latar belakang yang menghapus unggahan pending yang tidak pernah selesai.
Satu kesalahan yang sering terlupakan tim adalah tidak punya rencana untuk retry dan duplikat. Jaringan seluler putus. Pengguna mengetuk dua kali. Sistem Anda harus memperlakukan “unggah berkas yang sama lagi” sebagai hal normal.
Pendekatan praktis adalah menghasilkan upload ID terlebih dahulu, lalu menerima chunk atau satu file, dan menandai record terverifikasi hanya setelah validasi lulus. Jika unggahan yang sama diulang, kembalikan record yang ada daripada membuat salinan kedua.
Jika Anda membangun ini di AppMaster, simpan aturan inti di satu tempat (logika backend) sehingga web dan mobile berperilaku sama, bahkan ketika UI berubah.
Daftar periksa cepat sebelum meluncurkan
Sebelum Anda membuka unggahan untuk pengguna nyata, lakukan pemeriksaan cepat pada dasar-dasarnya. Sebagian besar masalah unggahan pada skala besar berasal dari celah kecil yang hanya muncul setelah Anda memiliki banyak pengguna, banyak berkas, dan banyak kasus pinggiran.
- Allowlist tipe file dan tetapkan batas ukuran per kasus penggunaan (avatar vs faktur). Validasi baik ekstensi maupun tipe konten nyata.
- Simpan metadata unggahan di database: siapa pemiliknya (user, team, account), untuk apa, dan status yang jelas seperti
pending,verified, ataublocked. - Jaga penyimpanan privat secara default, dan terapkan pengecekan izin pada setiap unduhan (jangan mengandalkan URL tersembunyi).
- Gunakan tautan unduhan kedaluwarsa saat berbagi diperlukan, dan buat masa berlaku singkat (menit atau jam, bukan hari).
- Hindari data pribadi di path dan nama file. Gunakan ID acak, dan tampilkan nama tampilan yang ramah di UI.
Punya jawaban untuk unggahan yang ditinggalkan. Normal bagi pengguna memulai unggahan dan tidak menyelesaikannya, atau sering mengganti berkas.
Rencana pembersihan sederhana:
- Hapus file yatim piatu yang tidak pernah mencapai
verifiedsetelah waktu tertentu. - Simpan jendela retensi untuk file yang diganti, lalu hapus.
- Catat kejadian penting (upload, validasi, download, delete) sehingga dukungan bisa menyelidiki.
Jika Anda membangun ini di AppMaster, simpan metadata di PostgreSQL via Data Designer, terapkan pengecekan di Business Process Editor, dan hasilkan token unduhan jangka pendek sebelum menyajikan file.
Langkah berikutnya: luncurkan dengan aman, lalu tingkatkan sedikit demi sedikit
Cara tercepat mencapai rilis yang aman adalah memilih satu pendekatan unggahan dan tetap menggunakannya. Tentukan apakah berkas lewat backend Anda terlebih dulu, atau diunggah langsung ke object storage dengan token jangka pendek. Lalu tulis langkah-langkah tepat dan siapa yang bertanggung jawab tiap langkah (klien, backend, penyimpanan). Konsistensi mengalahkan kepintaran saat Anda menangani unggahan berkas pada skala besar.
Mulailah dengan default yang ketat. Batasi tipe file ke apa yang benar-benar Anda perlukan, buat batas ukuran konservatif, dan minta autentikasi untuk apa pun yang tidak dimaksudkan publik. Jika pengguna meminta file lebih besar atau format lebih banyak, longgarkan satu aturan pada satu waktu dan ukur dampaknya.
Tambahkan pemantauan dasar sejak awal sehingga masalah muncul cepat:
- Tingkat kegagalan unggahan (per perangkat, browser, dan tipe file)
- Ukuran unggahan rata-rata dan p95
- Waktu unggah (terutama di jaringan seluler)
- Pertumbuhan penyimpanan per hari atau per minggu
- Kesalahan unduhan (termasuk tautan kedaluwarsa atau terlarang)
Jika sistem unggahan ini bagian dari aplikasi yang lebih besar, jaga model data dan izin dekat dengan logika bisnis Anda. Tim yang menggunakan AppMaster sering menaruh record unggahan di PostgreSQL, menerapkan validasi dan kontrol akses berkas di Business Processes, dan menggunakan logika yang sama di backend, web app, dan native mobile app.
Satu perbaikan berguna berikutnya adalah menambahkan preview untuk format umum, log audit untuk dokumen sensitif, atau aturan retensi sederhana (mis. hapus unggahan sementara setelah 30 hari). Peningkatan kecil dan bertahap menjaga sistem tetap andal saat penggunaan tumbuh.
FAQ
Mulailah dengan menuliskan kategori nyata yang Anda harapkan: avatar, faktur, kontrak, lampiran tiket, ekspor, dan sebagainya. Untuk setiap kategori, tentukan siapa yang bisa mengunggah, siapa yang bisa melihat, siapa yang bisa mengganti atau menghapus, apakah berbagi harus kedaluwarsa, dan berapa lama disimpan. Keputusan-keputusan itu menentukan model database dan pengecekan izin sehingga Anda tidak perlu membangun ulang semuanya nanti.
Gunakan allowlist dan periksa baik ekstensi nama file maupun MIME type yang terdeteksi dari isi file. Tetapkan batas ukuran yang jelas per tujuan file, dan tambahkan pengecekan lebih dalam bila perlu, misalnya dimensi gambar atau jumlah halaman PDF. Ganti nama file menjadi ID yang dihasilkan dan simpan nama asli sebagai metadata untuk menghindari bentrokan dan nama file yang tidak aman.
Ekstensi mudah dipalsukan, dan MIME type bisa tidak konsisten antar perangkat dan browser. Memeriksa keduanya menangkap banyak spoofing yang jelas, tetapi untuk unggahan berisiko tinggi Anda juga harus memverifikasi signature file (magic bytes) di server saat verifikasi. Perlakukan apa pun yang gagal sebagai blocked dan cegah unduhan sampai ditinjau atau dihapus.
Buat dulu record di database dan kembalikan upload ID, lalu unggah berkas biner dan konfirmasi selesai. Ini mencegah “berkas misterius” di penyimpanan tanpa pemilik atau tujuan, dan memungkinkan Anda menegakkan izin sebelum data berpindah. Ini juga memudahkan pembersihan karena Anda dapat menemukan unggahan pending yang terlantar dengan andal.
Buat penyimpanan bersifat privat secara default dan kendalikan akses melalui logika izin aplikasi Anda. Buat object keys yang dapat diprediksi tetapi tidak memasukkan data pribadi, menggunakan ID tenant atau workspace ditambah upload ID yang tidak bisa ditebak, dan simpan detail yang ramah manusia di database. Pisahkan berkas asli dari turunan seperti thumbnail agar retensi dan izin tidak saling bercampur.
Perlakukan akses metadata dan akses byte sebagai izin yang berbeda. Banyak pengguna boleh melihat bahwa sebuah berkas ada tanpa boleh mengunduhnya. Selalu terapkan aturan deny-by-default pada unduhan, catat akses untuk dokumen sensitif, dan jangan mengandalkan “URL yang sulit ditebak” sebagai kontrol utama.
Signed URLs cepat dan sederhana, tetapi setelah tautan dibagikan biasanya sulit dicabut sampai kadaluwarsa. Endpoint unduhan berbasis token memungkinkan Anda memeriksa izin setiap permintaan dan mencabut akses segera dengan menonaktifkan token. Dalam praktiknya, masa berlaku pendek ditambah pembatasan erat pada satu berkas dan satu tindakan mengurangi risiko tanpa banyak gesekan.
Rancang retry sebagai perilaku normal: koneksi seluler putus, pengguna menyegarkan, dan unggahan terduplikasi. Buat upload ID terlebih dulu, terima unggahan terhadap ID itu, dan buat langkah konfirmasi idempoten sehingga mengulanginya tidak membuat salinan ekstra. Jika ingin mengurangi duplikat lebih jauh, simpan checksum setelah unggahan dan deteksi unggahan ulang dari konten yang sama untuk tujuan yang sama.
Unggahan pending akan menumpuk ketika pengguna meninggalkan formulir atau koneksi terputus, jadi jadwalkan pembersihan sejak hari pertama. Kedaluwarsa dan hapus record pending lama dan objek penyimpanannya, dan simpan item blocked hanya selama diperlukan untuk investigasi. Untuk dokumen yang diganti, simpan jendela retensi untuk kebutuhan audit, lalu hapus versi lama secara otomatis.
Modelkan unggahan sebagai entitas sendiri di PostgreSQL dengan field status, owner, scope, dan purpose, lalu terapkan aturan dalam satu alur backend sehingga web dan mobile berperilaku sama. Masukkan langkah validasi dan verifikasi ke dalam Business Process sehingga setiap jalur unggahan menerapkan allowlist, batas, dan transisi status yang sama. Sajikan unduhan melalui Business Process yang lebih ketat yang memeriksa izin dan mengeluarkan token unduhan jangka pendek saat perlu berbagi.


