Advertisement
  1. Code
  2. PHP
  3. CodeIgniter

Cara Mengunggah File dengan CodeIgniter dan AJAX

Scroll to top
Read Time: 9 min

() 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!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.