Cara Mengunggah File dengan CodeIgniter dan AJAX
() translation by (you can also view the original English article)
Mengunggah file secara bersamaan dapat menjadi hal yang menyakitkan pada saat-saat terbaiknya, tetapi ketika digabungkan dengan CodeIgniter, ini dapat menjadi pengalaman yang sangat membuat frustrasi. Saya akhirnya menemukan cara yang tidak hanya berfungsi secara konsisten, tetapi tetap pada pola MVC. Baca terus untuk mengetahui caranya!
Kata Pengantar
Dalam tutorial ini, kita akan menggunakan framework PHP CodeIgniter, framework JavaScript jQuery, dan skrip AjaxFileUpload.
Diasumsikan Anda memiliki pengetahuan tentang CodeIgniter dan jQuery, tetapi tidak diperlukan pengetahuan sebelumnya tentang AjaxFileUpload. Juga diasumsikan bahwa Anda sudah memiliki instalasi CodeIgniter yang sudah disiapkan.
Demi keringkasan, pemuatan di libraries/models/helpers tertentu telah dihilangkan. Ini dapat ditemukan dalam kode sumber yang disediakan, dan hal-hal yang cukup standar.
Anda juga membutuhkan database, dan sebuah tabel, yang disebut files
. SQL untuk membuat tabel tersebut adalah:
1 |
CREATE TABLE `files` ( |
2 |
`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY, |
3 |
`filename` varchar(255) NOT NULL, |
4 |
`title` varchar(100) NOT NULL |
5 |
);
|
Pada akhir tutorial, struktur file Anda akan terlihat mirip dengan ini (menghilangkan folder/file yang tidak diubah):
public_html/
-- application/
---- controllers/
------ upload.php
---- models/
------ files_model.php
---- views/
------ upload.php
------ files.php
-- css/
---- style.css
-- files/
-- js/
---- AjaxFileUpload.js
---- site.js
Langkah 1 - Membuat Formulir



Mengatur Controller
Pertama, kita perlu membuat formulir unggahan kita. Buat Controller baru, yang disebut upload, dan dalam metode index, render view upload.
Controller Anda akan terlihat seperti ini:
1 |
class Upload extends CI_Controller |
2 |
{
|
3 |
public function __construct() |
4 |
{
|
5 |
parent::__construct(); |
6 |
$this->load->model('files_model'); |
7 |
$this->load->database(); |
8 |
$this->load->helper('url'); |
9 |
}
|
10 |
|
11 |
public function index() |
12 |
{
|
13 |
$this->load->view('upload'); |
14 |
}
|
15 |
}
|
Kita juga memuat model files, sehingga kita dapat menggunakannya dalam metode kita. Alternatif yang lebih baik mungkin untuk autoload dalam proyek Anda yang sebenarnya.
Membuat Formulir
Membuat view Anda, upload.php. View ini akan berisi formulir unggahan kita.
1 |
<!doctype html>
|
2 |
<html>
|
3 |
<head>
|
4 |
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> |
5 |
<script src="<?php echo base_url()?>js/site.js"></script> |
6 |
<script src="<?php echo base_url()?>js/ajaxfileupload.js"></script> |
7 |
<link href="<?php echo base_url()?>css/style.css" rel="stylesheet" /> |
8 |
</head>
|
9 |
<body>
|
10 |
<h1>Upload File</h1> |
11 |
<form method="post" action="" id="upload_file"> |
12 |
<label for="title">Title</label> |
13 |
<input type="text" name="title" id="title" value="" /> |
14 |
|
15 |
<label for="userfile">File</label> |
16 |
<input type="file" name="userfile" id="userfile" size="20" /> |
17 |
|
18 |
<input type="submit" name="submit" id="submit" /> |
19 |
</form>
|
20 |
<h2>Files</h2> |
21 |
<div id="files"></div> |
22 |
</body>
|
23 |
</html>
|
Jangan lupa letakkan ajaxfileupload.js di js/.
Seperti yang Anda lihat, kita memuat skrip kita di bagian atas; jQuery, AjaxFileUpload, dan file js kita sendiri. Ini akan menjadi JavaScript kustom kita.
Kemudian, kita hanya membuat formulir HTML standar. Div #files yang kosong adalah tempat daftar file yang diunggah.
Beberapa CSS Sederhana
Hanya saja tidak terlihat begitu buruk, mari tambahkan beberapa CSS dasar ke file style.css kita di css/.
1 |
h1, h2 { font-family: Arial, sans-serif; font-size: 25px; } |
2 |
h2 { font-size: 20px; } |
3 |
|
4 |
label { font-family: Verdana, sans-serif; font-size: 12px; display: block; } |
5 |
input { padding: 3px 5px; width: 250px; margin: 0 0 10px; } |
6 |
input[type="file"] { padding-left: 0; } |
7 |
input[type="submit"] { width: auto; } |
8 |
|
9 |
#files { font-family: Verdana, sans-serif; font-size: 11px; } |
10 |
#files strong { font-size: 13px; } |
11 |
#files a { float: right; margin: 0 0 5px 10px; } |
12 |
#files ul { list-style: none; padding-left: 0; } |
13 |
#files li { width: 280px; font-size: 12px; padding: 5px 0; border-bottom: 1px solid #CCC; } |
Langkah 2 - Javascript
Buat dan buka site.js di js/. Tempatkan kode berikut:
1 |
$(function() { |
2 |
$('#upload_file').submit(function(e) { |
3 |
e.preventDefault(); |
4 |
$.ajaxFileUpload({ |
5 |
url :'./upload/upload_file/', |
6 |
secureuri :false, |
7 |
fileElementId :'userfile', |
8 |
dataType : 'json', |
9 |
data : { |
10 |
'title' : $('#title').val() |
11 |
}, |
12 |
success : function (data, status) |
13 |
{ |
14 |
if(data.status != 'error') |
15 |
{ |
16 |
$('#files').html('<p>Reloading files...</p>'); |
17 |
refresh_files(); |
18 |
$('#title').val(''); |
19 |
} |
20 |
alert(data.msg); |
21 |
} |
22 |
}); |
23 |
return false; |
24 |
}); |
25 |
}); |
JavaScript membajak pengiriman formulir dan AjaxFileUpload mengambil alihnya. Di latar belakang, itu menciptakan iframe dan mengirimkan data melalui itu.
Kita melewatkan nilai title dalam parameter data panggilan AJAX. Jika Anda memiliki lebih banyak bidang dalam formulir, Anda akan meneruskannya di sini.
Kita kemudian memeriksa kembalian kita (yang akan ada di JSON). Jika tidak ada kesalahan, kita menyegarkan daftar file (lihat di bawah), kosongkan bidang title. Apapun itu, kita memperingatkan pesan tanggapannya.
Langkah 3 - Mengunggah File
Controller
Sekarang untuk mengunggah file-nya. URL yang akan kita unggah adalah /upload/upload_file/, jadi buat metode baru di controller upload, dan tempatkan kode berikut di dalamnya.
1 |
public function upload_file() |
2 |
{
|
3 |
$status = ""; |
4 |
$msg = ""; |
5 |
$file_element_name = 'userfile'; |
6 |
|
7 |
if (empty($_POST['title'])) |
8 |
{
|
9 |
$status = "error"; |
10 |
$msg = "Please enter a title"; |
11 |
}
|
12 |
|
13 |
if ($status != "error") |
14 |
{
|
15 |
$config['upload_path'] = './files/'; |
16 |
$config['allowed_types'] = 'gif|jpg|png|doc|txt'; |
17 |
$config['max_size'] = 1024 * 8; |
18 |
$config['encrypt_name'] = TRUE; |
19 |
|
20 |
$this->load->library('upload', $config); |
21 |
|
22 |
if (!$this->upload->do_upload($file_element_name)) |
23 |
{
|
24 |
$status = 'error'; |
25 |
$msg = $this->upload->display_errors('', ''); |
26 |
}
|
27 |
else
|
28 |
{
|
29 |
$data = $this->upload->data(); |
30 |
$file_id = $this->files_model->insert_file($data['file_name'], $_POST['title']); |
31 |
if($file_id) |
32 |
{
|
33 |
$status = "success"; |
34 |
$msg = "File successfully uploaded"; |
35 |
}
|
36 |
else
|
37 |
{
|
38 |
unlink($data['full_path']); |
39 |
$status = "error"; |
40 |
$msg = "Something went wrong when saving the file, please try again."; |
41 |
}
|
42 |
}
|
43 |
@unlink($_FILES[$file_element_name]); |
44 |
}
|
45 |
echo json_encode(array('status' => $status, 'msg' => $msg)); |
46 |
}
|
Kode ini dimuat di library upload CodeIgniter dengan konfigurasi kustom. Untuk referensi lengkapnya, periksa dokumentasi CodeIgniter.
Kita melakukan pemeriksaan sederhana untuk menentukan apakah judul itu kosong atau tidak. Jika tidak, kita memuat di perpustakaan upload CodeIgniter. Perpustakaan ini menangani banyak validasi file untuk kita.
Selanjutnya, kita mencoba mengunggah file. Jika berhasil, kita menyimpan judul dan nama file (diteruskan melalui array data yang dikembalikan).
Ingat untuk menghapus file temp dari server, dan echo JSON-nya sehingga kita tahu apa yang terjadi.
Model
Sesuai dengan pola MVC, interaksi DB kita akan ditangani oleh model.
Buat file_model.php, dan tambahkan kode berikut:
1 |
class Files_Model extends CI_Model { |
2 |
|
3 |
public function insert_file($filename, $title) |
4 |
{
|
5 |
$data = array( |
6 |
'filename' => $filename, |
7 |
'title' => $title |
8 |
);
|
9 |
$this->db->insert('files', $data); |
10 |
return $this->db->insert_id(); |
11 |
}
|
12 |
|
13 |
}
|
Folder Files
Kita juga harus membuat folder tempat file-file kita diunggah. Buat file baru di root web Anda yang bernama files, pastikan rewriteble oleh server.
Langkah 4 - Daftar File



Setelah unggahan berhasil, kita perlu menyegarkan daftar file untuk menampilkan perubahannya.
JavaScript
Buka site.js dan tambahkan kode berikut ke bagian bawah file, di bawah yang lainnya.
1 |
function refresh_files() |
2 |
{ |
3 |
$.get('./upload/files/') |
4 |
.success(function (data){ |
5 |
$('#files').html(data); |
6 |
}); |
7 |
} |
Ini hanya memanggil url dan memasukkan kembali data ke div
dengan id file.
Kita perlu memanggil fungsi ini pada pemuatan halaman untuk menampilkan daftar file pada awalnya. Tambahkan ini dalam fungsi document ready di bagian atas file:
1 |
refresh_files(); |
Controller
URL yang kita panggil untuk mendapatkan daftar file adalah /upload/files/, jadi buatlah metode baru yang disebut files, dan tempatkan kode berikut:
1 |
public function files() |
2 |
{
|
3 |
$files = $this->files_model->get_files(); |
4 |
$this->load->view('files', array('files' => $files)); |
5 |
}
|
Metode yang cukup kecil, kita menggunakan model kita untuk memuat dalam file yang saat ini disimpan dan meneruskannya ke view.
Model
Model kita menangani pengambilan daftar file. Buka files_model.php, dan tambahkan fungsi get_files()
.
1 |
public function get_files() |
2 |
{
|
3 |
return $this->db->select() |
4 |
->from('files') |
5 |
->get() |
6 |
->result(); |
7 |
}
|
Cukup sederhana: pilih semua file yang tersimpan di database.
View
Kita perlu membuat view untuk menampilkan daftar file. Buat file baru, yang disebut files.php, dan tempelkan kode berikut:
1 |
<?php
|
2 |
if (isset($files) && count($files))
|
3 |
{
|
4 |
?>
|
5 |
<ul>
|
6 |
<?php
|
7 |
foreach ($files as $file)
|
8 |
{
|
9 |
?>
|
10 |
<li class="image_wrap"> |
11 |
<a href="#" class="delete_file_link" data-file_id="<?php echo $file->id?>">Delete</a> |
12 |
<strong><?php echo $file->title?></strong> |
13 |
<br /> |
14 |
<?php echo $file->filename?>
|
15 |
</li>
|
16 |
<?php
|
17 |
}
|
18 |
?>
|
19 |
</ul>
|
20 |
</form>
|
21 |
<?php
|
22 |
}
|
23 |
else
|
24 |
{
|
25 |
?>
|
26 |
<p>No Files Uploaded</p> |
27 |
<?php
|
28 |
}
|
29 |
?>
|
Perulangan ini melalui file dan menampilkan judul dan nama file masing-masing. Kita juga menampilkan tautan hapus, yang menyertakan atribut data dari ID file.
Menghapus File
Untuk mengakhiri tutorial, kita akan menambahkan fungsi untuk menghapus file, juga menggunakan AJAX.
JavaScript
Tambahkan yang berikut dalam fungsi document ready:
1 |
$('.delete_file_link').live('click', function(e) { |
2 |
e.preventDefault(); |
3 |
if (confirm('Are you sure you want to delete this file?')) |
4 |
{ |
5 |
var link = $(this); |
6 |
$.ajax({ |
7 |
url : './upload/delete_file/' + link.data('file_id'), |
8 |
dataType : 'json', |
9 |
success : function (data) |
10 |
{ |
11 |
files = $(#files); |
12 |
if (data.status === "success") |
13 |
{ |
14 |
link.parents('li').fadeOut('fast', function() { |
15 |
$(this).remove(); |
16 |
if (files.find('li').length == 0) |
17 |
{ |
18 |
files.html('<p>No Files Uploaded</p>'); |
19 |
} |
20 |
}); |
21 |
} |
22 |
else |
23 |
{ |
24 |
alert(data.msg); |
25 |
} |
26 |
} |
27 |
}); |
28 |
} |
29 |
}); |
Itu selalu ide yang baik untuk mendapatkan konfirmasi pengguna saat menghapus informasi.
Ketika tautan hapus diklik, kita menampilkan kotak konfirmasi yang menanyakan apakah pengguna itu yakin. Jika ya, kita membuat panggilan ke /upload/delete_file
, dan jika berhasil, kita memudarkannya dari daftar.
Controller
Seperti di atas, url yang kita panggil adalah /upload/delete_file/
, jadi buat metode delete_file
, dan tambahkan kode berikut:
1 |
public function delete_file($file_id) |
2 |
{
|
3 |
if ($this->files_model->delete_file($file_id)) |
4 |
{
|
5 |
$status = 'success'; |
6 |
$msg = 'File successfully deleted'; |
7 |
}
|
8 |
else
|
9 |
{
|
10 |
$status = 'error'; |
11 |
$msg = 'Something went wrong when deleteing the file, please try again'; |
12 |
}
|
13 |
echo json_encode(array('status' => $status, 'msg' => $msg)); |
14 |
}
|
Sekali lagi, kita membiarkan model melakukan pekerjaan beratnya, meng-echo output.
Model
Kita sekarang berada di bagian akhir dari teka-teki: dua metode terakhir kita.
1 |
public function delete_file($file_id) |
2 |
{
|
3 |
$file = $this->get_file($file_id); |
4 |
if (!$this->db->where('id', $file_id)->delete('files')) |
5 |
{
|
6 |
return FALSE; |
7 |
}
|
8 |
unlink('./files/' . $file->filename); |
9 |
return TRUE; |
10 |
}
|
11 |
|
12 |
public function get_file($file_id) |
13 |
{
|
14 |
return $this->db->select() |
15 |
->from('files') |
16 |
->where('id', $file_id) |
17 |
->get() |
18 |
->row(); |
19 |
}
|
Karena kami hanya memberikan ID, kita perlu mendapatkan nama file, jadi kita membuat metode baru untuk memuat file. Setelah dimuat, kita menghapus record dan menghapus file dari server.
Itu dia, tutorial selesai! Jika Anda menjalankannya, Anda harus dapat mengunggah file, melihatnya muncul, dan kemudian menghapusnya; semua tanpa meninggalkan halaman.
Pemikiran Akhir
Tentunya, view dapat dilakukan dengan beberapa penyesuaian, tetapi tutorial ini seharusnya memberi Anda cukup untuk dapat mengintegrasikan ini ke dalam situs Anda.
Namun, ada beberapa kekurangan dalam metode ini:
- Anda hanya dapat mengunggah satu file dalam satu waktu, tetapi ini dapat diperbaiki dengan mudah menggunakan layanan seperti Uploadify.
- Tidak ada progress bar yang dibangun di skrip.
- Kita dapat mengurangi panggilan SQL dengan memperbarui file div saat unggahan file, bukan sepenuhnya menggantikannya.
Terima kasih telah membaca!