Maksud dari
judul di atas adalah bagaimana ide membuat aplikasi untuk keperluan
upload dan download file, namun dengan disertai pembatasan hak akses.
Misalkan user A mengupload sebuah file. Nah… file ini hanya boleh
didownload oleh si A. Bila ada user lain yang mencoba mendownload atau
menghapus file tersebut maka tidak diperbolehkan.
Aplikasi ini juga nantinya disertai semacam autentifikasi
artinya tidak sembarangan orang bisa upload file, melainkan hanya
user-user tertentu saja yang berhak.
Langkah pertama,
kita siapkan terlebih dahulu 2 buah tabel yaitu tabel ‘user’ dan tabel
‘upload’. Tabel ‘user’ digunakan untuk menyimpan data user yang berhak
mengakses, serta tabel ‘upload’ untuk menyimpan file-file yang diupload
oleh user.
CREATE TABLE
user (
username varchar(20),
password varchar(32),
PRIMARY KEY (username)
)
CREATE TABLE upload (
id int(11) AUTO_INCREMENT,
name varchar(30),
type varchar(30),
size int(11),
content mediumblob,
username varchar(20),
PRIMARY KEY (id)
)
Pada tabel
‘upload’, field ID digunakan untuk memberikan nomor ID dari setiap file
supaya unik (pembeda tiap file) karena bisa jadi nama file yang diupload
user adalah sama. Field ‘name’ terkait dengan nama file yang diupload,
‘type’ terkait dengan jenis file apakah berupa image, text file atau
dokumen dll, ‘size’ menyatakan ukuran file, dan ‘content’ untuk
menyimpan isi file (di sini menggunakan blob atau mediumblob). Nah..
kemudian field ‘username’ digunakan untuk memberikan informasi
kepemilikan dari file, milik user siapakah file tersebut.
Selanjutnya untuk sekedar mencoba, Anda bisa sekalian tambahkan
beberapa user
INSERT INTO `user` VALUES ('a', 'pass1');
INSERT INTO `user` VALUES ('b', 'pass2');
Catatan: dalam
contoh ini sengaja saya tidak mengenkripsi password login masing-masing
username supaya Anda bisa mencoba. Namun.. lebih baik jika Anda gunakan enkripsi.
Langkah kedua, kita
siapkan form login untuk user
index.htm
<h1>Login
User</h1>
<form
method="post" action="login.php">
<table>
<tr><td>Username</td><td><input
type="text" name="user"></td></tr>
<tr><td>Password</td><td><input
type="password" name="pass"></td></tr>
<tr><td></td><td><input
type="submit" name="submit" value="Submit"></td></tr>
</table>
</form>
Langkah kedua, kita bisa buat script untuk memproses loginnya
login.php
<?php
// koneksi ke mysql
mysql_connect('dbhost', 'dbuser', 'dbpass');
mysql_select_db('dbname');
// membaca username dan password dari
form login
$username = $_POST['user'];
$password = $_POST['pass'];
// mencari data user yang login
tujuannya untuk mendapatkan password dari database
$query = "SELECT * FROM user WHERE username = '$username'";
$hasil = mysql_query($query);
$data = mysql_fetch_array($hasil);
// mencocokkan password user dari
database dengan password dari form
if ($password == $data['password'])
{
// jika kedua
password sama, maka login berhasil
// simpan username ke dalam session
session_start();
$_SESSION['username'] = $username;
echo "<h1>Login Sukses</h1>";
echo "<h2>Anda login sebagai : ".$username."</h2>";
// tampilkan menu user
echo "<p>[ <a
href='formupload.php'>Upload</a> ] [ <a
href='list.php'>Daftar File</a> ] [ <a
href='logout.php'>Logout</a> ]</p>";
}
else
{
// jika kedua
password tidak cocok, maka login gagal
echo "<h1>Maaf login
gagal</h1>";
}
?>
Perhatikan script
di atas! Terdapat 3 buah menu yang akan tampil begitu user berhasil
login. Menu ‘upload’ untuk melakukan proses upload file, ‘daftar file’
untuk melihat daftar file apa saja yang telah diuploadnya, dan ‘logout’
untuk proses logout. Nah.. di antara ketiga menu tersebut, menu ‘upload’
yang diarahkan ke script ‘formupload.php’ dan ‘daftar file’ yang
diarahkan ke script ‘list.php’ ini hendaknya diproteksi supaya hanya
bisa diakses oleh user yang telah terdaftar dalam database saja.
Maksudnya, kedua script tersebut haruslah hanya bisa diakses oleh user
yang telah melakukan login dengan sukses saja. Sehingga untuk keperluan
ini, kita harus mengatur strategi supaya user nakal tidak bisa mengakses
kedua script tersebut tanpa login (by pass)… he.. 3x kayak mau perang
saja pake strategi segala
Nah… untuk mencegah
ada penyusup yang masuk tanpa login, kita buat dulu script untuk
pengamanannya.
cek.php
<?php
session_start();
if (!isset($_SESSION['username']))
{
echo "<h1>Maaf Anda belum login</h1>";
exit;
}
?>
Ide dari script
pengaman di atas adalah dengan mengecek keberadaan session dengan nama
‘$_SESSION['username']‘. Bila login berhasil, maka session tersebut ada
(perhatikan kembali script login.php). Namun bila user mencoba masuk
tanpa login, maka keberadaan session ini tidak ada. Sehingga bila
session tersebut dideteksi tidak ada, maka ditolak dengan pesan ‘Maaf
Anda belum login’.
Nah… selanjutnya
script cek.php di atas diincludekan ke dalam script ‘formupload.php’ dan
‘list.php’.
Langkah berikutnya,
kita sudah bisa buat script untuk formupload.php nya
formupload.php
<?php
session_start();
include "cek.php";
// membaca nama user yang tersimpan
dalam session
$username = $_SESSION['username'];
echo "<h1>Anda login sebagai : ".$username."</h1>";
echo "<p>[ <a
href='formupload.php'>Upload</a> ] [ <a
href='list.php'>Daftar File</a> ] [ <a
href='logout.php'>Logout</a> ]</p>";
echo "<p>Silakan upload
file</p>";
?>
//
form untuk upload
<form
method="post" enctype="multipart/form-data" action="upload.php">
<table>
<tr><td><input
type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input
name="userfile" type="file">
</td>
<td><input
name="upload" type="submit" value="Upload">
</td>
</tr>
</table>
</form>
Perhatikan pada tag <input name=”userfile” type=”file”>.
Tag ini digunakan untuk input file yang akan diupload. Tag ini diberikan
nama komponen ‘userfile’. Nama komponen ini selanjutnya akan digunakan
dalam script proses uploadnya.
upload.php
<?php
session_start();
// untuk keamanan, kita juga includekan
cek.php
include "cek.php";
// membaca nama file
$fileName = $_FILES['userfile']['name'];
// membaca nama file temporary
$tmpName = $_FILES['userfile']['tmp_name'];
// membaca size file
$fileSize = $_FILES['userfile']['size'];
// membaca tipe file
$fileType = $_FILES['userfile']['type'];
// membaca username yang disimpan dalam
session
// username ini
sekaligus menyatakan informasi pemilik file
$username = $_SESSION['username'];
// langkah membaca isi file yang
diupload
$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
// koneksi ke mysql
mysql_connect('dbhost','dbuser','dbpass');
mysql_select_db('dbname');
// query SQL untuk menyimpan file ke
database disertai username pemiliknya
$query = "INSERT INTO upload (name, size, type, content, username)
VALUES ('$fileName', '$fileSize', '$fileType', '$content', '$username')";
mysql_query($query);
echo "<h1>Anda login sebagai : ".$username."</h1>";
echo "<p>[ <a href='formupload.php'>Upload</a> ] [
<a href='list.php'>Daftar File</a> ] [ <a
href='logout.php'>Logout</a> ]</p>";
// konfirmasi
echo "<p>File ".$fileName." telah terupload</p>";
?>
Setelah kita
membuat script untuk proses upload, berikutnya kita buat script list.php
untuk menampilkan daftar file yang telah diupload
list.php
<?php
session_start();
include "cek.php";
// koneksi ke mysql
mysql_connect('dbhost','dbuser','dbpass');
mysql_select_db('dbname');
// membaca username yang disimpan dalam
session
$username = $_SESSION['username'];
echo "<h1>Anda login sebagai : ".$username."</h1>";
echo "<p>[ <a
href='formupload.php'>Upload</a> ] [ <a
href='list.php'>Daftar File</a> ] [ <a
href='logout.php'>Logout</a> ]</p>";
echo "<h2>Daftar File
Anda</h2>";
// query untuk mencari file yang telah
diupload milik si user yang sedang login
$query = "SELECT * FROM upload WHERE username = '$username'";
$hasil = mysql_query($query);
// menampilkan nama-nama file yang
telah diupload si user yang sedang login
echo "<ul>";
while ($data = mysql_fetch_array($hasil))
{
echo "<li><a href='download.php?id=".$data['id']."'>".$data['name']."</a> (<a
href='delete.php?id=".$data['id']."'>x</a>)</li>";
}
echo "</ul>";
?>
Pada daftar file
yang tampil, si user dapat mendownload file nya dengan mengklik nama
filenya atau menghapusnya dengan mengklik tanda X yang ada di sebelah
kanan nama file. Untuk proses download, linknya akan diarahkan ke script
‘download.php’ dan hapus file di arahkan ke ‘delete.php’. Kedua link
tersebut ditambahkan parameter ‘?id=…’ yang digunakan untuk
mengidentifikasi file apa yang akan didownload atau dihapus, mengingat
pembeda antar file adalah ID nya.
Bagaimana script
download.php nya? trus bagaimana idenya supaya file tersebut hanya
berhak didownload oleh user yang telah menguploadnya atau yang berhak?
ya… konsepnya kita cari dulu nama username pemilik file yang akan
didownload dalam database. Selanjutnya kita cocokkan username pemiliknya
dengan username yang sedang login. Jika sama atau cocok, maka bolehlah
file tersebut didownload. Jika tidak, maka tolak mentah-mentah
download.php
<?php
session_start();
// sisipkan cek.php untuk keamanan
include "cek.php";
// koneksi ke mysql
mysql_connect('dbhost','dbuser','dbpass');
mysql_select_db('dbname');
// membaca nilai ID file yang berasal
dari link download.php?id=...
$id = $_GET['id'];
// membaca username yang sedang login
melalui session
$username = $_SESSION['username'];
// query untuk mencari data file yang
akan didownload dalam database
$query = "SELECT * FROM upload WHERE id =
$id";
$hasil
= mysql_query($query);
$data = mysql_fetch_array($hasil);
// mencocokkan username pemilik file
dengan username yang sedang login
if ($username == $data['username'])
{
// bila
usernamenya cocok maka file boleh didownload
header("Content-Disposition:
attachment; filename=".$data['name']);
header("Content-length:
".$data['size']);
header("Content-type:
".$data['type']);
echo $data['content'];
}
else
{
// bila tidak
sama maka file tidak boleh didownload
echo "<h1>Anda tidak berhak
mengakses file</h1>";
}
?>
Konsep yang hampir sama juga kita terapkan dalam delete.php.
Artinya bahwa mekanisme pencocokan username pemilik file dengan username
yang sedang login juga harus dilakukan sebelum file dihapus.
delete.php
<?php
session_start();
include "cek.php";
// koneksi ke mysql
mysql_connect('dbhost','dbuser','dbpass');
mysql_select_db('dbname');
// membaca id file yang akan dihapus
$id = $_GET['id'];
// membaca username yang sedang login
$username = $_SESSION['username'];
// mencari username pemilik file yang
akan dihapus
$query = "SELECT username FROM upload
WHERE id = $id";
$hasil = mysql_query($query);
$data = mysql_fetch_array($hasil);
// mencocokkan username pemilik file
dengan username yang sedang login
if ($username == $data['username'])
{
// jika cocok
maka hapus file
$query = "DELETE FROM upload WHERE id = $id";
mysql_query($query);
echo "<h1>Anda login sebagai : ".$username."</h1>";
echo "<p>[ <a
href='formupload.php'>Upload</a> ] [ <a
href='list.php'>Daftar File</a> ] [ <a
href='logout.php'>Logout</a> ]</p>";
echo "<p>File telah
dihapus</p>";
}
else
{
// jika tidak cocok maka tolak
echo "<h1>Maaf Anda tidak berhak
menghapus file ini</h1>";
}
?>
Yang terakhir,
jangan lupa buat script logout.php untuk proses logoutnya. Konsep logout
adalah dengan menghapus session yang digunakan untuk menyimpan username
yang login.
logout.php
<?php
session_start();
// menghapus session
session_destroy();
echo "<h1>Anda sudah logout</h1>";
?>
Perhatian:
Script di atas sudah melalui tahap pengujian dan dipastikan 100%
dapat berjalan dengan normal. Bila Anda mencoba dan mengalami kesalahan
atau berjalan tidak normal maka dipastikan kesalahan ada pada Anda.
Coba cek kembali script yang Anda buat.
Tutorial yang sangat bagus..
BalasHapusSalam
walaikumsalam
HapusGan .... minta file script yang udah jadi ke abu.aljayyid@gmail.com .... saya coba gagal terus!
BalasHapusminta script yang udah jadi dong gan, tolong kirim ke anggi.prihandani@gmail.com
BalasHapustrims...
minta script yang udah jadi dong gan suryaplonot@gmail.com
BalasHapusini file yang di upload masuk ke mana?
BalasHapusthanks gan. ini yang ane cari untuk web ane.
BalasHapusTolong gan kirim ke irvan281197@gmail.com buat pkl gan
BalasHapusTolong gan kirim ke irvan281197@gmail.com buat pkl gan
BalasHapus