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! 😀
Sekedar masukan, untuk ekstensi file misal ada titik di nama file selain titik pemisah ekstensi dan nama file, misal : “Data .Pegawai.xls”, gimana caranya?
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
Ohya betul2 (y)
bagaimana jika di dalam folder yang akan di upload sudah ada nama file yang sama ?
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.
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)
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.
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 ?
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.
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.
Setelah di otak-atik ternyata berhasil…
dengan melakukan validasi di sini :
terimakasih Pak..
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.
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.
Pak mau tanya kalau kode saya kaya gini, biar gak terjadi file tanpa ektensi gimana perubahannya pak? masih bingung sayah
Buat variabel yang berbeda untuk setiap ekstensi file yang berbeda namanya.
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.
Cek nilai dari property field tersebut menggunakan kode:
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’.
Silahkan dicek property mana yang berisi data dari path file yang sesungguhnya (yang tidak dienkripsi).
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 ?
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.
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 ?
Silahkan cek lagi kode di artikel atas. Sudah saya perbarui barusan.
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.
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.
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)
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 ?
Sudah coba pakai fungsi PHP unlink? Silahkan Google untuk info lebih lanjut.
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”] != “”) {
Taruh di Row_Updated.
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.
Ganti kode ini:
dengan yang ini:
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.
Silahkan bereksperimen sendiri dengan mengganti kondisi di dalam if statement tersebut.
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
Pesan itu artinya, hak akses direktori tidak dapat ditulisi. Silahkan ubah hak akses direktorinya supaya dapat ditulisi atau bisa menerima file di dalamnya.
cara mudah untuk merubahnya bagaimana ?
Ubah dari sisi Sistem Operasinya.
untuk caranya bagaimana pak, saya menggunakan sistem operasi windows 7
Klik kanan folder-nya, lalu pilih Properties, lalu hapus tanda ceklist di atribut Read-only.