Penggunaan fungsi FILEUPLOAD pada PHP

Penggunaan fungsi FILEUPLOAD pada PHP

Onphpid – Dalam membuat website terutama saat membuat CMS ( Content Management System ) dengan bahasa program (server side) khususnya php pastilah ada fitur upload, entah itu fungsi untuk upload file atau upload gambar. Misalnya saja upload photo pada halaman registrasi atau halaman management user, upload gambar background pada website atau upload cover pada facebook.

Fungsi upload ini memang sudah tidak asing atau bukan hal yang baru. Tapi karena sudah banyak tutorial yang memuat tentang cara membuat script upload file dengan php seperti halnya tutorial yang onphpid ini buat. Namun fungsi upload file dengan php kali ini sedikit berbeda dengan script upload file dengan php yang pernah onphpid temukan, karena fungsi atau script upload ini akan dijadikan sebuah fungsi baru dengan menggunakan fungsi php function().

FUNCTION() atau php function() ini merupakan salah satu power dari php yang nyata karena kemudahannya dalam membuat fungsi-fungsi baru sesuai keinginan kita. Ada beberapa hal yang perlu diperhatikan tentang fungsi ini.

1.    Fungsi ini perlu dideklarasikan sebelum digunakan
2.    Fungsi ini berlaku saat file php yang memuat fungsi ini di load
3.    Fungsi ini akan bekerja saat fungsi tersebut dipanggil

Fungsi upload sendiri didasarkan pada fungsi php move_uploaded_file, fungsi yang mengijinkan kita untuk memindah file baik photo, gambar, doc, zip dan sebagai dari komputer kita ke hosting, server atau website kita. Pada penerapannya fungsi upload dengan php ini membutuhkan sebuah request berupa $_FILES melalui perantara Form dari tag html dengan menambahkan attribut  enctype=”multipart/form-data” pada tag form  dan tag input yang bertipe file tersebut hingga menjadi:

<form action=""method="post"enctype="multipart/form-data">

    <label for="">Upload file:</label>

    <input type="file"name="upload"/>

    <button>Upload</button>

</form>

Dan seperti biasa step by step membuat script untuk form upload dengan php ini adalah membuat sebuah database dengan nama “belajar” dan sebuah table dengan nama “upload” karena kita akan menyimpan data file yang kita upload ini kedalam database, di sini yang kita simpan dalam database adalah alamat dari file yang telah terupload dengan fungsi php move_uploaded_file.

Berikut keterangan dari table upload yang akan kita buat

Penggunaan fungsi FILEUPLOAD pada PHP

Step selanjutnya adalah membuat file-file php berikut :

  • Buatlah direktori php-file-upload
  • Functions.php
  • Index.php
  • Config.php

Setelah file-file php yang kita butuhkan sudah dibuat maka selanjutnya adalah mengisinya dengan fungsi-fungsi php.

Pertama kita mulai dari config.php, config.php adalah file untuk membuat perintah koneksi dengan database mysql dan di sini kita menggunakan fungsi mysqli dari php untuk berinteraksi dengan database mysql. Silahkan lihat script  berikut:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<?php

# Variable untuk koneksi ke database

$dbhost='localhost';

$dbuser='root';

$dbpass='';

$dbname='belajar';

# fungsi koneksi ke database

$db=newmysqli($dbhost,$dbuser,$dbpass,$dbname);

# tes koneksi ke database berhasil atau gagal

if($db->connect_error){

    # jika terjadi kegagalan dalam melakukan koneksi kedatabase

    die('Gagal Terhubung dengan database : '.$db->connect_error);

}

# variabel konstanta untuk menyimpan alamat root

# output c:\xampp\htdocs\php-file-uploads

define( 'MAIN',dirname(__FILE__));

?>

define(‘MAIN’, dirname(__FILE__) ) ini merupakan variable konstanta untuk menyimpan path atau alamat folder secara lengkap dari root dengan bantuan fungsi dirname(__FILE__). dirname(__FILE__) ini berfungsi untuk mendeteksi folder terakhir dimana fungsi ini diletakkan. Dalam kasus ini path yang dihasilkan adalah c:\xampp\htdocs\php-file-upload karena file config.php yang terdapat fungsi dirname(__FILE__) di dalamnya ini berada di folder php-file-upload ( direktori utama ).

Yang kedua adalah membuat file functions.php dimana file functions.php ini memuat fungsi-fungsi yang kita buat dengan php function() dalam hal ini adalah fungsi upload.

*/ function upload_data( $fileupload = array(), $argument = array() ) { global $filename,$error; if( !defined('MAIN') ){ $error = 'Direktori utama belum diset.
'; $error .= 'Silahkan diset dengan menggunakan fungsi '; $error .= 'define(\'MAIN\',dirname(__FILE__)) '; $error .= 'di file config.php / file koneksi database anda / file index.php'; return FALSE; } /** parameter default */ $param = array( 'target_file' => 'uploads', 'limit' => 100, ); if( is_array($argument) && count($argument) > 0 ){ # modifikasi parameter default dengan parameter baru $param = array_merge($param,$argument); } /** mengubah Array menjadi Variable */ extract($param); if( !isset( $fileupload['error'] ) || is_array( $fileupload['error'] ) ){ $error = 'Parameter Upload Salah Mohon Cek Kembali'; return FALSE; } /** check status file yang diupload dan ketersediaan server */ switch ($fileupload['error']) { case UPLOAD_ERR_OK: break; case UPLOAD_ERR_NO_FILE: $error = 'File Gagal Di kirim'; case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: $error = 'Batas Upload Server tidak cukup.'; default: $error = 'Unknown errors.'; } $extention = end( explode('.', $fileupload['name']) ); /** extensi file yang tidak diupload */ $forbiden_ext = array('php','pl','jsp','asp','sh','cgi','html','css'); if( in_array( $extention, $forbiden_ext ) ){ $error = 'Ekstensi File tidak diijinkan'; return FALSE; } # set limit dalam bit $limit_in_bit = $limit*1000; if ( $fileupload['size'] > $limit_in_bit ) { $error = 'File yang diupload tidak boleh lebih dari '.$limit.' Kb'; return FALSE; } # check keberadaan direktori uploads $target_file = trim($target_file,'/'); if( !is_readable( MAIN . '/' . $target_file ) ){ # jika tidak ada direktori yang dimaksud sistem akan membuat direktori tersebut if( !mkdir( MAIN . '/' . $target_file ) ){ # jika sistem gagal membuat direktori $error = 'Direktori untuk meletakkan file belum ada, '; $error .= 'Sistem gagal membuat direktori ' . $target_file; return FALSE; } } # nama file dibuat unique $newfilename = md5( uniqid().$fileupload["tmp_name"] ) . '.'.$extention; # upload file move_uploaded_file($fileupload["tmp_name"], $target_file.'/'.$newfilename); $filename = $newfilename; return TRUE; } /** * @return blank jika tidak ada error, jika terdapat error maka akan muncul errornya apa */ function get_error_upload(){ global $error; return $error; } /** * @return nama file yang di acak, jika berhasil diupload */ function get_file_name(){ global $filename; return $filename; }

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

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

<?php

/**

* @package fungsi upload

*/

global$filename,$error;

/**

* @var $fileupload digunakan untuk mengambil nilai dari parameter $_FILE[<param>]

* @var $target_file adalah folder untuk meletakkan file yang diupload

* @var limit, untuk membatasi jumlah maksimal size file yang diupload (satuan Kb )

* @param $_FILE[<param>], <param> diambil dari attribut name dari tag input <input name="param" />

*/

functionupload_data($fileupload=array(),$argument= array())

{    

    global$filename,$error;

    if(!defined('MAIN')){

        $error  = 'Direktori utama belum diset. <br> ';

        $error.='Silahkan diset dengan menggunakan fungsi ';

        $error.='define(\'MAIN\',dirname(__FILE__)) ';

        $error .='di file config.php / file koneksi database anda / file index.php';

        returnFALSE;

    }

    /** parameter default */

    $param= array(

        'target_file'=>'uploads',

        'limit'          =>100,

        );

    if(is_array($argument)&& count($argument) > 0 ){

        # modifikasi parameter default dengan parameter baru

        $param = array_merge($param,$argument);

    }

    /** mengubah Array menjadi Variable */

    extract($param);

    if(!isset($fileupload['error']) ||  is_array($fileupload['error'])){

        $error='Parameter Upload Salah Mohon Cek Kembali';

        return FALSE;

    }

    /** check status file yang diupload dan ketersediaan server */

    switch($fileupload['error']){

        case UPLOAD_ERR_OK:

            break;

        caseUPLOAD_ERR_NO_FILE:

            $error='File Gagal Di kirim';

        caseUPLOAD_ERR_INI_SIZE:

        caseUPLOAD_ERR_FORM_SIZE:

            $error='Batas Upload Server tidak cukup.';

        default:

            $error='Unknown errors.';

    }

    $extention=end(explode('.', $fileupload['name']));

    /** extensi file yang tidak diupload */

    $forbiden_ext= array('php','pl','jsp','asp','sh','cgi','html','css');

    if(in_array($extention, $forbiden_ext)){

        $error='Ekstensi File tidak diijinkan';

        returnFALSE;

    }

    # set limit dalam bit

    $limit_in_bit=$limit*1000;

    if($fileupload['size']>$limit_in_bit){

        $error ='File yang diupload tidak boleh lebih dari '.$limit.' Kb';

        returnFALSE;

    }

    # check keberadaan direktori uploads

    $target_file =trim($target_file,'/');

    if(!is_readable(MAIN.'/'.$target_file)){

        # jika tidak ada direktori yang dimaksud sistem akan membuat direktori tersebut

        if(!mkdir(MAIN.'/'.$target_file)){

            # jika sistem gagal membuat direktori

            $error  ='Direktori untuk meletakkan file belum ada, ';

            $error.='Sistem gagal membuat direktori '. $target_file;

            returnFALSE;

        }

    }

    # nama file dibuat unique

    $newfilename =md5(uniqid().$fileupload["tmp_name"]).'.'.$extention;

    # upload file

    move_uploaded_file($fileupload["tmp_name"], $target_file.'/'.$newfilename);

    $filename=$newfilename;

    returnTRUE;

}

/**

* @return blank jika tidak ada error, jika terdapat error maka akan muncul errornya apa

*/

functionget_error_upload(){

    global$error;

    return$error;

}

/**

* @return nama file yang di acak, jika berhasil diupload

*/

functionget_file_name(){

    global$filename;

    return$filename;

}

 Baca Juga : Mengubah Array menjadi variable

Dengan fungsi diatas kita cukup menggunakan fungsi upload_data($file_yg_diupload) untuk mengupload sebuah file baik file gambar ataupun file yang lain kecuali file yang berekstensi php,pl,jsp,asp,sh,cgi,html dan css dikhawatirkan website akan di inject dengan file-file tersebut.
Sedangkan fungsi global pada script upload di atas berfungsi sebagai penangkap dan menyimpan value dari variable-variable yang ada di dalam script upload, dalam kasus ini variable yang ditangkap dan disimpan adalah $filename dan $error.

Di tutorial kali ini kita akan mencoba mengupload sebuah file gambar atau photo saja untuk selebihnya kalian bisa mengembangkan sendiri script upload yang sudah kita buat dengan php function.
Dan step yang terakhir adalah mengisi file index.php kita dengan script berikut :

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

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

<?php

# menyisipkan file config dan functions.php

require('config.php');

require('functions.php');

# eksekusi fungsi upload

if( isset($_FILES['upload']))

{

    if(upload_data($_FILES['upload'],array('limit'=>500)) ){

        $namafile='uploads/'.get_file_name();

        $sql="INSERT INTO upload (file_name) VALUES ('$namafile')";

        $query =$db->query($sql);

        if(!$query)

        {

            echo $db->error;

        }else{

            echo'<img src="uploads/'.get_file_name().'"/>';    

        }

    }else{

        echoget_error_upload();

    }

}

?>

<form action=""method="post"enctype="multipart/form-data">

    <label for="">Upload file:</label>

    <input type="file"name="upload"/>

    <button>Upload</button>

</form>

<hr>

<h4>List Gambaryangdiupload</h4>

<?php

# menampilkan gambar yang sudah diupload

$sql   ="SELECT * FROM upload";

$query=$db->query($sql);

if($query->num_rows>0){

    while($row=$query->fetch_assoc()){

        echo '<img src="'.$row['file_name'].'"/>';

    }

}

?>

 Baca juga Perbedaan HTML dan PHP

Adapun argumen argumen yang bisa kita tambahkan pada fungsi upload_data() tadi dengan argumen argumen berikut :

Standard penggunaan fungsi upload_data()

upload_data($_FILES['upload'])

Mengubah limitasi atau pembatasan ukuran file yang diupload dalam satuan KB (Kilobyte)

upload_data($_FILES['upload'],array('limit'=>500));

Memindah lokasi atau direktori untuk meletakkan file yang diupload

upload_data($_FILES['upload'],array('uploads'=>'images'));

Memindakan lokasi sekaligus memberikan batasan file yang diupload

upload_data($_FILES['upload'],array('uploads'=>'images','limit'=>500));

Menampilkan nama file yang sudah diupload

<?phpechoget_file_name();?>

ini hanya muncul setelah fungsi upload selesai dijalankan, karena fungsi get_file_name() ini ditujukan untuk report
Menampilkan error saat terjadi kesalahan dalam proses upload

<?phpget_error_upload();?>

Sama halnya dengan get_file_name(), get_error_upload() juga merupakan report.

Dan secara default fungsi upload_data() tersebut akan meletakkan file yang diupload pada folder uploads dan batasan maksimal file yang diupload adalah 100KB. Apabila folder uploads ini belum ada fungsi upload_data() akan membuat direktori atau folder tersebut. Sedangkan untuk penamaan file kita gunakan nama unik dengan menggunakan fungsi md5() dan fungsi uniqid() sehingga tidak terjadi replace atau penggantian file yang kebetulan namanya sama.