Apakah Anda pernah mengalami kesulitan ketika harus mengubah nama file yang diupload Pengguna melalui Aplikasi Web yang Anda bangun? Lalu apa yang Anda lakukan saat itu? Menyerah begitu saja dengan membiarkan Pengguna menggunakan nama file sembarangan atau yang berpotensi nama file sama, sehingga menjadi tidak sedap dipandang mata? Hm, jangan pernah sekalipun, karena artikel ini membahas solusinya buat Anda!
Sudah bukan rahasia lagi bahwa sebagai Web Developer kita harus menangani penamaan file yang diupload oleh Pengguna melalui sistem. Mengapa? Karena kita tidak bisa memaksa semua Pengguna untuk mengikuti format nama file yang kita tentukan. Kalau sudah begini, maka jalan satu-satunya adalah mendisiplinkan Pengguna melalui bantuan sistem. Caranya? Biarkan sistem yang mengubah secara otomatis nama file yang diupload tadi.
Percaya atau tidak, bahwa Aplikasi Web yang dibangun dengan PHPMaker bisa mengatasi permasalahan klasik ini dengan sangat mudah dan cepat. Artinya? Sebagai Web Developer kita tidak perlu pusing-pusing lagi memikirkan bagaimana cara menulis kode PHP yang jika dibangun dengan cara manual bisa sampai mencapai berpuluh-puluh, beratus-ratus, atau bahkan beribu-ribu baris.
Kita dapat menggunakan server event Row_Inserting (saat data baru sedang ditambahkan ke Database) atau Row_Updating (saat data yang sudah ada sedang disimpan ke Database). Cukup hanya beberapa baris kode PHP saja yang kita tambahkan dari dalam project PHPMaker, maka kita sebagai Web Developer sudah dapat mengatasinya. Dengan demikian, maka kita bisa lebih fokus untuk mengimplementasikan proses bisnis ke Aplikasi Web yang kita bangun.
Katakanlah di Aplikasi Web yang kita bangun dengan PHPMaker, kita ingin supaya file yang diupload Pengguna hanya saat data sedang ditambahkan, dan sistem akan otomatis me-rename nama file tersebut. Jadi, untuk case berikut kita abaikan saat update data.
Untuk itu, pastikan kita sudah mengeset field (misalnya) Nama_File supaya menggunakan tipe File Upload pada panel Edit Tag dari bagian Fields setup di project PHPMaker.
Selanjutnya, kita juga ingin supaya sistem secara otomatis mengubah nama file dengan format tertentu yang menyertakan komponen dari beberapa field lainnya di tabel tersebut. Solusinya, kita cukup mengoptimalkan object $rsnew di server event Row_Inserting, sehingga kode selengkapnya menjadi seperti ini:
// Row Inserting event function Row_Inserting($rsold, &$rsnew) { // Enter your code here // To cancel, set return value to FALSE if ($rsnew["Nama_File"] != "") { // pastikan ada file yang di-upload, updated on January 24, 2017 $ekstensi_file = substr(strtolower(strrchr($rsnew["Nama_File"], ".")), 1); $tanggal_upload = str_replace("-", "", $rsnew["Tanggal_Upload"]); $tanggal_upload = str_replace(":", "", $tanggal_upload); $tanggal_upload = str_replace(" ", "", $tanggal_upload); $rsnew["Nama_File"] = $rsnew["Kode_Transaksi"] . "_" . $rsnew["Kantor_Upload"] . "_" . $tanggal_upload . "_" . $rsnew["Kelompok_File"] . "." . $ekstensi_file; } return TRUE; }
Sekarang mari kita bahas kode barusan pelan-pelan, supaya segala sesuatunya bisa lebih mudah dimengerti dan menjadi penuh makna, hehehe… 😉
Pertama sekali kita harus mengambil data ekstensi atau tipe file, lalu menampung hasilnya ke dalam variabel $ekstensi_file. Jadi, jika misalnya nama file yang diupload adalah Data_Pegawai.xls, maka nilai pada variabel $ekstensi_file menjadi xls. Data ekstensi ini sangat penting untuk memastikan bahwa nama lengkap file hasil perubahan tetap menggunakan ekstensi aslinya.
Langkah kedua, kita menghilangkan karakter minus (-), spasi, dan titik dua (:) yang terdapat pada field Tanggal_Upload, lalu menampung hasilnya ke dalam variabel $tanggal_upload. Jadi, jika seandainya nilai asli field ini adalah 2015-02-25 18:39:47, maka nilai pada $tanggal_upload tadi menjadi 20150225183947.
Langkah ketiga, kita membuat nama file yang baru dengan cara menggabungkan beberapa komponen yang nilainya diperoleh dari beberapa field sebagai berikut: Kode_Transaksi, Kantor_Upload, Tanggal_Upload, dan Kelompok_File. Di antara setiap komponen tadi, kita memisahkan dengan karakter garis bawah (_), dan pastikan di bagian akhir kita menutupnya dengan menambahkan karakter titik yang diikuti dengan data ekstensi filenya.
Sedangkan untuk proses Edit data, maka kita bisa menggunakan server event Row_Updating:
// Row Updating event function Row_Updating($rsold, &$rsnew) { // Enter your code here // To cancel, set return value to FALSE if ($rsnew["Nama_File"] <> $rsold["Nama_File"] && $rsnew["Nama_File"] != "") { // pastikan ada file yang di-upload, updated on January 24, 2017 $ekstensi_file = substr(strtolower(strrchr($rsnew["Nama_File"], ".")), 1); $tanggal_upload = str_replace("-", "", $rsnew["Tanggal_Upload"]); $tanggal_upload = str_replace(":", "", $tanggal_upload); $tanggal_upload = str_replace(" ", "", $tanggal_upload); $rsnew["Nama_File"] = $rsnew["Kode_Transaksi"] . "_" . $rsnew["Kantor_Upload"] . "_" . $tanggal_upload . "_" . $rsnew["Kelompok_File"] . "." . $ekstensi_file; } return TRUE; }
Terakhir, generate ulang semua file script dengan PHPMaker seperti biasa. Selesai!
Wow! Secepat itu! Semudah itu! Bayangkan, Saudara-saudara! Selebihnya untuk urusan teknis lain, sudah ditangani oleh PHPMaker. Memang luar biasa kerennya PHPMaker ini, bah! 😀
Bisakah tools Web Development yang Anda gunakan melakukan hal tersebut dengan sangat mudah dan cepat seperti di atas? So? Serius ingin berpindah menggunakan PHPMaker sekarang juga? Ehm, ehm! 😀
Cak Sobri mengatakan
Sekedar masukan, untuk ekstensi file misal ada titik di nama file selain titik pemisah ekstensi dan nama file, misal : “Data .Pegawai.xls”, gimana caranya?
Masino Sinaga mengatakan
Seharusnya tidak masalah, karena function strrchr itu akan selalu mencari karakter tertentu dan ditemukan terakhir dalam suatu string. Jadi, meskipun ada beberapa karakter yang sama, dia akan mencari yang terakhir, dimulai dari posisi kiri sampai ke kanan.
Selengkapnya mengenai function tersebut bisa Anda lihat di http://php.net/manual/en/function.strrchr.php
Cak Sobri mengatakan
Ohya betul2 (y)
Edi mengatakan
bagaimana jika di dalam folder yang akan di upload sudah ada nama file yang sama ?
Masino Sinaga mengatakan
PHPMaker akan otomatis me-rename file yang terakhir dengan menambahkan akhiran dalam format angka supaya tidak bentrok dengan file yang sudah ada.
Tapi kalau Anda mengikuti pola penamaan seperti di artikel ini, di mana menyertakan data tanggal, jam, menit, dan detik, maka kecil kemungkinan ada nama file yang sama.
rijal mengatakan
siiiip Pak Masino, sdh di coba dan berhasil.
namun ketika di coba di halaman Form Edit, masih terjadi Masalah.
misalnya saya punya tabel ARTIKEL dgn field :
id, judul_artikel, isi_artikel, tanggal, gambar.
untuk halaman Edit pada Server Event => Row Updating sdh sy coba Trik diatas.
namun terjadi masalah :
Masalah terjadi ketika kita hanya akan mengedit Judul / isi Artikel saja, (kita tidak Melakukan Edit pada Filed gambar / tidak ada File yang di Upload) atau kita mengabaikan filed gambar.
yang terjadi kira2 sperti ini :
jika file Gambar yang sudah diupload sebelumya namanya adalah : 20150225183947. jpg
maka menjadi : 20150225183947. (tanpa ekstensi)
tapi jika field gambar ikut di Edit / di Upload lagi tidak masalah.
intinya :
bagaimana Pak Masino caranya memValidasi Jika di Form Edit tidak ada File yang di Upload/ File tidak di edit maka Nama File gambar masih tetep (tidak berubah)
Masino Sinaga mengatakan
Tinggal ditambahkan saja pemeriksaan kondisi menggunakan if … else …
Periksa jika $rsnew[“Nama_File”] sama dengan $rsold[“Nama_File”], maka tidak perlu mengeksekusi kode tersebut di atas. Sebaliknya jika tidak sama atau $rsnew[“Nama_File”] berbeda dengan $rsold[“Nama_File”] (di block else), maka itu artinya ada file baru yang di-upload saat edit data, tinggal eksekusi saja kode tersebut.
Rijal mengatakan
Trimakasih Pak atas Responnya,
saya sudah coba utak-atik beberapa kali, dan yg terakhir seperti ini :
tapi hasilnya masih sama, yaitu jika field gambar tidak di edit maka menjadi (tanpa ekstensi file) , tapi jika file gambar di Edit / di Upload ulang berhasil.
kira-kira apakah ada yang salah dengan Script diatas ?
Rijal mengatakan
Kode di atas berhasil dijalankan dan menampilkan Warning Message jika File Gambar masih kosong ( jika pada input di Form artikeladd.php gambar dikosongkan / tidak di Upload)
tetapi jika gambar sudah ada dan saat berada di Form Edit filed gambar tidak di Edit atau di abaikan maka yang di eksekusi Perintah “]else{ $eksetensi_file…….. ” dan hasilnya tanpa Ekstensi File.
Masino Sinaga mengatakan
Coba eksperimen dengan menampilkan nilai $rsnew[“gambar”] di server event tersebut saat file gambar diupload atau tidak, lalu bandingkan hasilnya. Selanjutnya tinggal gunakan nilai di setiap kondisi tersebut sesuai yang Anda inginkan.
Rijal mengatakan
Setelah di otak-atik ternyata berhasil…
dengan melakukan validasi di sini :
terimakasih Pak..
Rijal mengatakan
setelah saya pelajari lagi, trnyata file hasil Upload kok masih bisa diakses secara umum ya Pak… ?
saya coba bikin upload file PDF , yg seharusnya hanya bisa di akses oleh User yang sudah Login saja, tapi ternyata masih bisa di akses secara umum,
misalnya : localhost/aplikasi/file/file-upload-20150508.pdf
misalnya User yang mengUpload sudah Logout, tetapi sisa URL tsb msh bisa diakses oleh User yg blm Login dgn memanfaatkan sisa URL.
apakah ada Pengaturannya supaya hanya User yg sdh login yang bisa mengakses File tersebut ?
Terimakasih.
Masino Sinaga mengatakan
Itu harus ditangani dari sisi web server, misalnya dengan membuat file .htaccess yang membatasi akses download file tersebut.
Alternatif lainnya, Anda bisa “menyamarkan” URL aslinya dengan membuat URL tertentu berdasarkan sebuah file .php, lalu dari dalam file .php tadi selanjutnya Anda konversikan menjadi URL-nya saat proses download.
Silahkan Google mengenai hal ini. Banyak contoh-contoh di Internet yang bisa Anda gunakan.
rahadiana nugraha mengatakan
Pak mau tanya kalau kode saya kaya gini, biar gak terjadi file tanpa ektensi gimana perubahannya pak? masih bingung sayah
Masino Sinaga mengatakan
Buat variabel yang berbeda untuk setiap ekstensi file yang berbeda namanya.
Rijal mengatakan
Pak Masino, saya coba merubah Tampilan (hanya Tampilan) di Halaman List isi Record dari Nama File (utk Link) misal di File tersebut setelah di Upload Nama nya adalah : 225246-jakarta110-surat0542-penting-20150805210534.pdf akan saya ubah menjadi “Lihat File” karena kalo Pake Nama File Asli yg tampil di list terlalu Panjang atau jika memungkinkan bisa diubah menjadi gambar ‘Tombol Link’.
sy sudah coba membuat Kode seperti ini
Kode diatas jika dipakai di PHP Maker 12 (dgn mengaktifkan Encrypt File Path) kok tidak bisa ya (blank) jika Kode tersebut dihilangkan masih bisa,
Untuk Pengaturan Target =Link to _blank Page juga tidak berfungsi padahal saat di PHP Maker 11 masih berfungsi.
Masino Sinaga mengatakan
Cek nilai dari property field tersebut menggunakan kode:
Rijal mengatakan
maaf pak masino, sy sdh coba cara diatas, kira2 hsilnya sprti artikel ini :
http://www.masinosinaga.com/phpmaker/mudahnya-mengoptimalkan-property-object-di-aplikasi-web-dari-phpmaker
tapi sy kok blm paham cara mengimplementasikan cara tersebut dgn pertanyaan sy diatas khususnya yg utk mempersingkat Link, jika mengaktifkan ‘encrypt file path’.
Masino Sinaga mengatakan
Silahkan dicek property mana yang berisi data dari path file yang sesungguhnya (yang tidak dienkripsi).
Rijal mengatakan
Pak Masino saya sudah coba beberapa cara kok masih belum berhasil, dan yg terakhir seperti ini :
Kemudian seperti ini :
sy juga sudah coba beberapa Properti yang lain yaitu :
HrefValue2, LinkCustomAttributes, LinkAttrs, OldUploadPath.
tapi semua cara tsbut kok belum bisa ya… kira2 apa ya Pak yg masih salah ?
Masino Sinaga mengatakan
Agak unik memang untuk penanganan property field yang tipel File Upload. Tidak bisa menggunakan cara seperti di atas.
Solusi terdekat adalah dengan menggunakan jQuery di bagian Client Scripts untuk mengubah teks yang terdapat di antara tag a href link.
Rijal mengatakan
Ternyata jika di Aplikasikan di Mode Edit memang belum bisa ,
jadi misal saya punya Tabel Dokumen : kode_dokumen, kategori, nama_dokumen, nik_user, nama_file.
saya pakai script ini di Row Updating :
Kekurangan dari script diatas adalah :
1. Jika pada Database=> field nama_file masih kosong (belum terisi) maka Upload berhasil dan sesuai dengan yang diharapkan.
2. Tapi jika di database sudah ada (misal nama_file.pdf) dan di folder upload sudah ada, ketika di Upload Kembali di Halaman Edit File maka File di folder terkait Hilang namun data di database masih tetap ada nama_file.pdf.
3. Jika misal nama_file.pdf sudah ada di database dan di folder, namun ketika yang di edit adalah Field lainnya misal yg di Edit hanya Field Kategori (tanpa upload File), maka Ekstensi nama file di Database hilang sehingga menjadi nama_file. (tanpa .pdf)
4. jika nama_file.pdf di database maupun di folder akan dihapus (di tiadakan) hanya File di folder saja yang terhapus namun data di database belum terhapus.
namun, ketika Script diatas di hapus semua berjalan lancar tanpa masalah namun nama file yang di Upload di Folder adalah sama dengan nama File sebelumnya (tanpa Custom).
saya juga sudah mencoba beberapa Seleksi pakai :
if ($rsnew[“nama_file”] !==””) atau
if(!isset($rsnew[“nama_file”]) atau dll… kok hasilnya kurang lebih masih sama,
kira-kira bagaimana ya pak.. apa ada yang harus di rubah pada Script saya di atas ?
Masino Sinaga mengatakan
Silahkan cek lagi kode di artikel atas. Sudah saya perbarui barusan.
Rijal mengatakan
Woww.. Terimakasih banyak Pak Masino. (Kasus No. 3 & 4 sdh berhasil)
Cuma untuk kasus No. 2 masih belum berhasil Pak. Jadi ketika di field Nama_File sebelumnya sudah ada File yg di Upload Sebelumnya, ketika Edit Data (Upload File Baru) maka File yg lama hilang dan File yang baru di Upload tidak ter Upload ke Database (namun data Nama_File.pdf di database masih ada)
Contoh Kasus :
misalnya User salah Upload File Dokumen => ketika akan di Update (ganti File Upload) melalui Edit Data maka File yang Lama itu hilang sedangkan File yg baru di Upload tidak terupload di Folder.
Masino Sinaga mengatakan
Coba aktifkan atau nonaktifkan pengaturan Delete file on update/delete dari tab PHP -> General Options -> File Upload.
Selain itu, cek ulang kode Anda di server event Row_Updating yang ini:
ganti dengan:
karena seharusnya data tersebut tidak berubah saat edit data.
Rijal mengatakan
oh iya Pak.. yang $rsnew[“nik_user”] nanti harusnya gak berubah,
untuk Pengaturan ini Delete file on update/delete dari tab PHP -> General Options -> File Upload. saya centang , karena saya memang memerlukan ketika data File di Edit atau hapus data File yang lama otomatis terhapus (agar tidak membebani Server) karena data file yg di hapus gak terpakai lagi.
tapi untuk semntara masih ada masalah yang tadi. (No.2)
Rijal mengatakan
Oh iya Pak, ini saya coba hilangkan Centang pada Delete file on update/delete dari tab PHP -> General Options -> File Upload. sudah berhasil.
cuma kelemahannya adalah ketika ada File yang di hapus (tidak terpakai) akan menumpuk di Server sehingga membebani Kapasitas Server, karena file tersebut tidak terhapus otomatis.
Apakah ada solusinya Pak mengenai hal ini ?
apa mungkin bisa menambahkan Kode Manual pada Row Updating tersebut, agar ketika ada File yang di hapus dari Aplikasi maka pada Folder Upload ikut terhapus juga ?
Masino Sinaga mengatakan
Sudah coba pakai fungsi PHP unlink? Silahkan Google untuk info lebih lanjut.
Rijal mengatakan
iya Pak ini saya sudah Googling tentang ini : unlink(“file_upload/”.$Nama_File);
cuma itu kan pake PHP Manual, yang jadi masalah adalah kalo pake PHP Maker Script tersebut ditaruh dimana ya ?
tadi saya coba di Row Deleting, tapi ga bisa ya, karena sebenarnya Recordnya tidak dihapus (hanya Field Nama_File) saja yang dihapus.
kalau di taruh di Row Updating sementara masih benturan dengan seleksi yang ini if ($rsnew[“Nama_File”] $rsold[“Nama_File”] && $rsnew[“Nama_File”] != “”) {
Masino Sinaga mengatakan
Taruh di Row_Updated.
Rijal mengatakan
Maaf Pak, Script ini saya sudah taruh di Row Updated :
tapi ketika yang di Edit data Lain (Field yang Lain), File di Folder terkait ikut terhapus, meskipun tidak ada tujuan utk Hapus File tersebut.
apa masih ada yang salah dengan Seleksi IF nya ya ?
karena saya coba dengan metode yg lain juga masih sama hasilnya.
Masino Sinaga mengatakan
Ganti kode ini:
dengan yang ini:
Rijal mengatakan
Maaf Pak Masino, kalo diganti seperti ini :
($rsnew[“Nama_File”] != “”)
ketika file akan di Hapus justru file nya gak bisa terhapus (yang terhapus hanya data field terkait di database tersebut).
sedangkan File yang berada di Folder Upload masih tetap ada.
Masino Sinaga mengatakan
Silahkan bereksperimen sendiri dengan mengganti kondisi di dalam if statement tersebut.
Sigit DC mengatakan
Selamat Malam pak, maaf sebelumnya saya kurang paham tentang urusan aplikasi web dari php
Saya mau upload data baik itu jpg maupun pdf tidak bisa , selalu muncul ini
File extension tidak diperbolehkan untuk foto.
30012017185132Ijazah SMA.jpg file can not be upload, please check directory permission …30012017185132Ijazah D3.pdf file can not be upload, please check directory permission …30012017185132ijazah.pdf file can not be upload, please check directory permission …30012017185132Setifikat.pdf file can not be upload, please check directory permission …
Data telah diupdate , Kira -kira masalahnya apa ? .. cara mengatasinya gimana biar bisa diupload ? .. terimakasih seelumnya
Masino Sinaga mengatakan
Pesan itu artinya, hak akses direktori tidak dapat ditulisi. Silahkan ubah hak akses direktorinya supaya dapat ditulisi atau bisa menerima file di dalamnya.
Sigit DC mengatakan
cara mudah untuk merubahnya bagaimana ?
Masino Sinaga mengatakan
Ubah dari sisi Sistem Operasinya.
Sigit DC mengatakan
untuk caranya bagaimana pak, saya menggunakan sistem operasi windows 7
Masino Sinaga mengatakan
Klik kanan folder-nya, lalu pilih Properties, lalu hapus tanda ceklist di atribut Read-only.