Menangani Penyimpanan File yang di-Upload ke Server

Dalam pembuatan aplikasi web, terkadang dibutuhkan suatu skenario untuk meng-upload satu atau beberapa file ke server. Untuk mengganti gambar profil di aplikasi jejaring sosial misalnya, pengguna pasti akan berurusan dengan skenario ini.

Proses meng-upload file pada aplikasi web ditangani oleh masing-masing infrastruktur dari aplikasi web yang digunakan, namun hampir seluruh urutan prosesnya sama: user akan memilih file, aplikasi web akan menyimpan file yang di-upload oleh user ke suatu path dengan nama file tertentu, kemudian jika dibutuhkan informasi file tersebut akan disimpan di database. Hal yang sering menjadi masalah adalah tentang metode menyimpan file-file tersebut.

Tulisan saya kali ini membahas beberapa cara yang bisa dilakukan untuk menangani penyimpanan file yang di-upload ke server lewat aplikasi web.

Cara 1: Simpan File Apa Adanya

Menyimpan file apa adanya adalah cara yang paling mudah dan juga paling tidak direkomendasikan. -_- Simpan file yang telah di-upload ke suatu direktori tertentu dengan nama yang sama persis saat di-upload.

Misalkan, ada seseorang bernama Budi yang menyimpan foto profil di komputernya dengan nama budi.jpg, maka aplikasi akan meng-upload dan menyimpannya juga dengan nama budi.jpg di suatu direktori di server.

Masalahnya akan muncul, jika ternyata ada Budi lain (sebut saja Budi 2) yang juga menyimpan foto profil dengan nama budi.jpgFile yang sama tentu saja akan tertimpa.

Jika hal seperti ini terjadi, tentu saja gambar foto profil Budi 1 dan Budi 2 akan selalu sama. Sedangkan di Indonesia mungkin ada ribuan orang dengan nama Budi (Budi 3, Budi 4, dan seterusnya). Dengan cara ini, gambar foto profil ribuan orang ini pasti akan selalu sama jika mereka meng-upload file dengan nama budi.jpg. Bayangkan saja, mereka akan saling berebut berganti gambar profil bukan?😛

Cara ini hanya untuk ilustrasi kemungkinan terburuk saja. Sebisa mungkin hindari cara sederhana ini, kecuali jika dapat dipastikan bahwa tiap user akan meng-upload file yang namanya pasti unik.

Cara 2: Simpan File di Dalam Database

Banyak Database Management System (DBMS) yang menyediakan tipe data binary untuk dapat menyimpan file langsung di simpan di dalam database. Tipe data binary large object (BLOB) di MySQL misalnya, dengan menggunakan tipe data ini, file yang di-upload oleh user dapat langsung di simpan di database dengan statement INSERT seperti biasa.

Namun sebaiknya sebelum menggunakan cara ini, pelajari tentang efek penyimpanan binary file  di dalam database terhadap performa dari DBMS yang digunakan, karena ada catatan tertentu terkait soal penggunaan cara ini.

Sebagai contoh, untuk pengguna DBMS MySQL, coba lihat halaman ini: http://stackoverflow.com/questions/5285857/when-is-using-mysql-blob-recommended

Cara 3: Simpan File di Direktori Tertentu Dengan Nama Khusus

Cara ketiga yang cukup mudah dan paling umum adalah menyimpan file tersebut dengan suatu nama khusus tertentu. Untuk cara ini, ada beberapa cara yang bisa dilakukan.

Contoh sederhana misalnya, aplikasi bisa saja menyimpan file yang telah di-upload tersebut dengan format nama tertentu. Sang programmer dapat membuat prosedur sedemikian sehingga setiap file yang di-upload akan disimpan dengan nama file-n.extension di mana n adalah urutan upload -nya. Jadi nanti di dalam direktori tempat file upload akan ada file-1.extension, file-2.extension dan seterusnya. Sedangkan informasi file yang aslinya bisa disimpan di dalam database.

Kelemahan metode ini adalah, sang programmer harus memikirkan sebuah fungsi untuk meng-generate format nama ini dengan benar tanpa kemungkinan adanya saling timpa.

Cara lain bisa juga dengan cara meng-generate sejenis random characters tertentu yang nantinya akan digunakan sebagai nama file. Dengan cara ini, sang programmer tinggal memikirkan 1 fungsi untuk menghasilkan karakter acak yang stabil untuk nama file yang akan disimpan.

Ngomong-ngomong soal karakter acak, ada beberapa cara yang bisa dilakukan. Di antaranya, sang programmer bisa menggunakan fungsi untuk meng-generate sebuah Universally Unique Identifier. Banyak bahasa pemrograman yang sudah memiliki built-in function untuk melakukan hal ini.

Ini contoh UUID: 88961191-5ad3-49b2-be97-c3f481820644. Spesifikasinya diatur dalam RFC 4122.

Banyak metode untuk menghasilkan karakter acak. Biasanya, dengan menggunakan parameter timestamp, keunikan karakter bisa dijamin. Membungkus string angka timestamp dengan fungsi md5 misalnya, itu sudah cukup menghasilkan karakter yang lumayan acak (lihat fungsi PHP di bawah sebagai contoh).

$randomCharacters = md5(strtotime("now"));

Untuk fungsi yang lebih reliabel, bisa juga menggunakan fungsi checksum untuk file. Fungsi checksum akan menghasilkan serentetan string yang unik dan tentunya dapat digunakan untuk nama file yang di-upload. Hasil checksum bisa dikatakan sebagai sidik jari dari suatu file sehingga terjamin keunikannya.

Algoritma checksum ada banyak pilihannya, dan sama seperti UUID tadi, fungsi built-in-nya juga sudah banyak di berbagai macam bahasa pemrograman. Tinggal dipakai saja.

Cara 4: Simpan File di Dalam Struktur Direktori Tertentu Dengan Nama Khusus

Cara nomor 3 di atas, boleh dipakai dengan catatan: jumlah file dalam direktori tempat penyimpanan file yang di-upload tidak terlalu banyak.

Saat mengakses suatu direktori dengan menggunakan perintah ls di Linux atau dir di Windows, terlebih dahulu, sistem harus melakukan pendataan terhadap isi direktori. Itulah mengapa saat menggunakan file explorer di semua sistem operasi, semakin banyak menyimpan file di dalam direktori maka akan semakin lama proses loading-nya.

Selain itu, setiap disk tempat penyimpanan data memiliki batas maksimum jumlah file yang dapat disimpan di dalam 1 direktori. Batas maksimum ini dipengaruhi oleh jenis file system yang digunakan (lihat tabel di bawah).

Sistem Operasi File System Jumlah File Maksimum di 1 Direktori
Windows FAT-32 268,173,300
NTFS 4,294,967,295 (232-1)
Linux ext3 Tergantung Kapasitas Disk
ext4 Tergantung Kapasitas Disk
Mac OS HFS 65,535
HFS+ 4,294,967,295 (232-1)

Diambil dari banyak sumber. Jika ada yang keliru mohon beri pemberitahuan pada penulis.

Jika aplikasi web yang dikembangkan akan menghasilkan banyak sekali file yang di-upload seperti aplikasi penyimpanan gambar, faktor ini harus sangat diperhatikan.

Untuk menangani hal ini, diantaranya, sang programmer dapat memisahkan file-file yang di-upload ke dalam klasifikasi-klasifikasi yang lebih spesifik dalam bentuk direktori. Misalnya, jika file yang di-upload diletakkan di direktori upload/, maka jika ada user yang bernama imamfile-nya bisa diletakkan di direktori upload/imam/.

Klasifikasi yang dilakukan dapat dipilih sesuai kebutuhan. Direktori klasifikasi bisa saja dibuat berdasarkan parameter tertentu. Sebagai contoh, aplikasi WordPress menyimpan file yang di-upload di direktori wp-content/uploads/, dan kemudian diklasifikasikan berdasarkan tahun, dan di dalamnya diklasifikasikan lagi berdasarkan bulan.

Ada banyak skenario lain yang mungkin lebih advanced dalam menangani penyimpanan file yang di-upload. Tulisan ini hanya membahas beberapa diantaranya. Demikianlah kira-kira sekelumit cara yang dapat dilakukan untuk menyimpan file yang di-upload oleh user ke dalam server. Semoga bermanfaat.🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s