author Ahmad Muhardian

Tutorial Slim Framework: Cara Upload File ke Webservice


Cara Upload File di Slim Framework

Upload file adalah fitur yang harus ada di setiap aplikasi web.

Lalu bagaimana cara kita membuat fitur upload untuk RESTful API atau webservice?

Itulah yang akan kita pelajari pada tutorial ini.

Kenapa harus upload ke webservice?

Karena kita akan bisa upload file dari mana saja, dari aplikasi android, web, desktop, bot, dan sebagainya.

Konsep Upload File di Slim Framework

File yang di-upload ke aplikasi Slim dapat kita tangkap dengan fungsi atau method getUploadedFiles().

Fungsi ini akan menghasilkan sebuah array yang berisi objek dari data file yang di-upload.

Contoh:

Array
(
    [photo] => Slim\Http\UploadedFile Object
        (
            [file] => /tmp/php0yzLB3
            [name:protected] => install-slim.png
            [type:protected] => image/png
            [size:protected] => 90765
            [error:protected] => 0
            [sapi:protected] => 1
            [stream:protected] => 
            [moved:protected] => 
        )

)

Pada aplikasi client, pastikan membuat form-nya denga atribut enctype="multipart/form-data".

Karena kalau tidak ada itu, maka fungsi getUploadedFiles() akan menghasilkan sebuah array kosong.

Penjelasan lebih lengkap tentang fungsi ini dapat dibaca pada dokumentasi Slim.

Sekarang mari kita lanjutkan project yang sebelumnya…

Membuat Upload pada RESTful API

Pada project sebelumnya, kita memiliki kolom gambar untuk cover buku. Sekarang kita ingin mengisinya dengan gambar yang diupload oleh client.

Secara garis besar, cara kerjanya seperti ini:

  1. Upload File;
  2. Ambil nama File lalu simpan ke database;
  3. Balas dengan URL file.

Sederhana sekali.

Baiklah, sekarang mari kita buka file src/settings.php kemudian tambahkan pengaturan seperti ini.

'upload_directory' => __DIR__ . '/../public/uploads', // upload directory

Pengaturan ini untuk mententukan lokasi file yang akan kita upload.

pengaturan untuk upload file

Setelah itu, buat sebuah direktori baru di dalam public bernama uploads.

Membuat direktori untuk upload file

Berikutnya kita akan membuat rute upload-nya.

Silahkan buka file src/routes.php, kemudian tambahkan kode berikut di paling atas:

use Slim\Http\UploadedFile;

Kode tersebut berfungsi untuk mengimpor fungsi getUploadedFiles().

Impor fungsi upload

Selanjutnya, silahkan buat rute untuk upload file:

$app->post('/books/cover/{id}', function(Request $request, Response $response, $args) {
    
    $uploadedFiles = $request->getUploadedFiles();
    
    // handle single input with single file upload
    $uploadedFile = $uploadedFiles['cover'];
    if ($uploadedFile->getError() === UPLOAD_ERR_OK) {
        
        $extension = pathinfo($uploadedFile->getClientFilename(), PATHINFO_EXTENSION);
        
        // ubah nama file dengan id buku
        $filename = sprintf('%s.%0.8s', $args["id"], $extension);
        
        $directory = $this->get('settings')['upload_directory'];
        $uploadedFile->moveTo($directory . DIRECTORY_SEPARATOR . $filename);

        // simpan nama file ke database
        $sql = "UPDATE books SET cover=:cover WHERE book_id=:id";
        $stmt = $this->db->prepare($sql);
        $params = [
            ":id" => $args["id"],
            ":cover" => $filename
        ];
        
        if($stmt->execute($params)){
            // ambil base url dan gabungkan dengan file name untuk membentuk URL file
            $url = $request->getUri()->getBaseUrl()."/uploads/".$filename;
            return $response->withJson(["status" => "success", "data" => $url], 200);
        }
        
        return $response->withJson(["status" => "failed", "data" => "0"], 200);
    }
});

Rute tersebut akan kita akses melalui /books/cover/id dengan metode POST.

Pertama-tama kita akan menangkap data yang di-upload dengan fungsi ini.

$uploadedFiles = $request->getUploadedFiles();
    
// handle single input with single file upload
$uploadedFile = $uploadedFiles['cover'];

Berikutnya kita melakukan pengecekan, apakah uploadnya berhasil atau tidak.

if ($uploadedFile->getError() === UPLOAD_ERR_OK){
    //...
}

Oya, file yang diupload akan disimpan sementara di direktori tmp.

Setelah itu, kita buat dulu nama file. Karena kita ingin menyimpan nama filenya dengan id dari buku.

// ambil ekstensi file yang di-upload
$extension = pathinfo($uploadedFile->getClientFilename(), PATHINFO_EXTENSION);

// ubah nama file dengan id buku
$filename = sprintf('%s.%0.8s', $args["id"], $extension);

Setelah itu, kita pindahkan file yang sudah di-upload ke direktori tujuan dengan fungsi ini.

$directory = $this->get('settings')['upload_directory'];
$uploadedFile->moveTo($directory . DIRECTORY_SEPARATOR . $filename);

Variabel $directory akan berisi alamat path (lokasi tujuan upload), sesuai dengan isi pada file src/settings.php yang sudah kita tentukan.

Terakhir, kita menyimpan nama file ke database dan membalas request.

// simpan nama file ke database
$sql = "UPDATE books SET cover=:cover WHERE book_id=:id";
$stmt = $this->db->prepare($sql);
$params = [
    ":id" => $args["id"],
    ":cover" => $filename
];

if($stmt->execute($params)){
    // ambil base url dan gabungkan dengan file name untuk membentuk URL file
    $url = $request->getUri()->getBaseUrl()."/uploads/".$filename;
    return $response->withJson(["status" => "success", "data" => $url], 200);
}

return $response->withJson(["status" => "failed", "data" => "0"], 200);

Kenapa kita tidak menyimpan full URL?

Karena bisa jadi nanti URL-nya berubah, maka kita harus lakukan update lagi.

Percobaan Upload File

Silahkan buka Postman untuk melakukan pengujian.

Pada Header, silahkan masukkan key seperti ini:

Header untuk upload file

Setelah itu, masuk ke bagian Body dan isi key-nya seperti ini:

Body untuk upload file

Sekarang kita bisa mulai upload dengan mengklik tombol Send.

upload file

Sukses! 🎉

Periksa hasilnya, silahkan buka URL tersebut.

upload file

Akhir Kata…

Itulah cara upload file di Slim Framework yang bisa diterapkan dalam aplikasimu.

Oya, contoh upload yang di atas, bisa menerima segala jenis file.

Sebenarnya ini kurang bagus, karena kita hanya butuh file gambar saja.

Lalu bagaimana caranya agar menerima file gambar saja?

Kita bisa melakukan filter atau pengecekan dengan atribut type.

Lebih detailnya, silahkan dipikirkan sendiri 😄.

Selamat berpikir…

Baca Juga ini

Tutorial Membuat RESTful API dengan Slim Framework

Tutorial Membuat RESTful API dengan Slim Framework

Bagaimana aplikasi bisa bertukar data dengan aplikasi yang lain? Jawabannya menggunakan API, lalu bagaimana cara membuat API?

Cara Menggunakan Twig Template Engine pada Slim Framework

Cara Menggunakan Twig Template Engine pada Slim Framework

Belajar menggunakan template engine Twig pada Slim Framework. Template Engine adalah bagian dari framework untuk membuat template. Twig merupakan sebuah template engine yang diklaim cepat, aman, dan fleksibel untuk PHP.

Pengenalan Slim Framework untuk Pemula

Pengenalan Slim Framework untuk Pemula

Slim Framework adalah mikro framework PHP untuk membuat aplikasi web. Biasanya digunakan untuk membuat REST API atau webserivice. Pada kesempatan ini, kita akan belajar dasar-dasar penggunaan Slim Framework. Mulai dari tahap instalasi, sampai membuat route. Catatan: Tutorial ini untuk Slim Versi 3 Baiklah, mari kita mulai… Konsep Slim FramworkSlim Framework sebenarnya sangat sederhana. Dia hanya bertugas menerima HTTP Request, lalu memanggil fungsi yang diinginkan. Setelah itu mengembalikan HTTP Response. Konsep #SlimFramework sangat sederhana.

Cara Membuat Contact Form di Laravel dengan Library PHPMailer

Cara Membuat Contact Form di Laravel dengan Library PHPMailer

Menerapkan library PHPMailer untuk membuat contact form di Laravel

Cara Menggunakan Dompdf di Codeigniter

Cara Menggunakan Dompdf di Codeigniter

Dompdf merupakan salah satu pustaka PHP untuk membuat PDF. Dompdf membuat PDF dari HTML, sehingga lebih praktis. Selain itu juga, Kita bisa menggunakan CSS di dalamnya. Saat ini Dompdf mendukung CSS versi 2.1. Untuk menggunakan Dompdf di Codeigniter, silahkan ikuti langkah-langkah berikut ini. 1. Aktifkan Autoload ComposerKita akan menginstal Dompdf melalui Composer. Karena itu, autoload untuk Composer perlu diaktifkan. Silahkan buka file application/config/config.php, kemudian isi bagian autoload Composer seperti ini.

Helper CodeIgniter untuk Membuat Tanggal dalam Bahasa Indonesia

Helper CodeIgniter untuk Membuat Tanggal dalam Bahasa Indonesia

Saat kita membuat sbuah tanggal otomatis dengan fungsi Date(), kita akan mendapatkan hasil dalam format bahasa inggris. Contoh, Date(’d F Y’) akan menghasilkan output 22 December 2016 (sesui tanggal sekarang). Format penanggalan ini mungkin tidak begitu penting bagi sistem yang tidak digunakan di tempat formal. Namun, bagaimana kalau untuk membuat surat atau laporan formal. Pastinya, kita dituntut untuk menggunakan bahasa indonesia yang baik dan benar. Hal yang perlu kita lakukan untuk merubah tanggal ke dalam bahasa indonesia adalah merubah nama-nama bulan dari fungsi Date().