Seringkali kita membuat kode (PHP) untuk membuat upload file seperti di bawah ini :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Folder tempat isi file upload
$dir		= "upload/" ;
 
// Nama File yang diupload
$filename	= $_FILES['upload']['name'] ;
 
// Spesifikasi lokasi file yang akan diupload
$target_dir = $dir . $filename ;
 
// upload
if(move_uploaded_file($_FILES['upload']['tmp_name'], $target_dir))
	return TRUE ;
else 
	return FALSE ;

Kode di atas memiliki kelemahan, salah satunya adalah jika diupload file berkas.odt kedalam folder “upload“, dimana sebelumnya di dalam folder upload telah ada file berkas.odt, maka berkas.odt yang lama akan te-replace oleh berkas.odt yang baru. Mungkin tidak akan ada masalah jika file-file tersebut serupa dan sama. Tapi jika file-file tersebut serupa tapi tidak sama (maksudnya nama file sama tetapi isi atau konten di dalamnya berbeda), tentu proses pengoleksian file-file yang telah diupload menjadi kacau, dan pasti kode di atas salah.

Untuk itu perlu diperbaiki kode program di atas untuk menghindari terjadi duplikasi nama file saat proses upload.

Berikut contoh kode perbaikannya :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Folder tempat isi file upload
$dir		= "upload/" ;
 
// Nama file yang diupload
$filename	= $_FILES['upload']['name'] ;
 
// Spesifikasi lokasi file yang akan diupload
$target_dir = $dir . $filename ;
 
/* 
* Gunakan fungsi file_exists() untuk memeriksa apakah 
* file X telah ada sebelumnya di folder Y 
*/
if(file_exists($target_dir)) {
	/* 
	* Iterasi sampai 100 dg asusmi file duplikasi (bernama sama) itu maksimal 100, 
	* lebih dari itu ... TERLALU (mode on Bang Rhoma) :-p
	*/
	for($i = 1; $i < 100; $i++) { 
		$target_dir = $dir . $i . '-' . $filename ;
		/* 
		* Misal file berkas.odt ada di folder sebelumnya, 
		* maka file berkas.odt yang baru akan direname menjadi 1-berkas.odt
		*/
		if(!file_exists($target_dir)) break;
	}
}
 
// upload
if(move_uploaded_file($_FILES['upload']['tmp_name'], $target_dir)) 
	return TRUE ;
else 
	return FALSE ;

Selamat mencoba. CMIIW.