Input File ke Laravel - Dunia Laravel
Isi dari website pasti
bukan cuma teks, kalo isinya teks doang pasti bosen kan. Dan kalo kita ngebuat
website dinamis artinya gambar nya juga harus bisa diinputin sama user. Karena akan
aneh kalo isi websitenya dinamis tapi gambarnya tetap statis. Di laravel input
file ga terlalu ribet kok.
Table of Contents
- Things That Need to be Prepared
- Make Views
- Materi Controller
Things That Need to be Prepared
Database
dan sebuah project laravel tentunya. Sekarang aku pake project yang seblumnya
aku buat di artikel CRUD. Tapi ga jauh beda kalo kalian buat dari awal.
Pertama kalian setting database sama table kalian
dulu. Struktur table bisa disesuaikan seperti keinginan kalian. Disini struktur
table yang aku pake kaya gini.
Schema::create('materi', function (Blueprint $table) {
$table->id();
$table->string('judul');
$table->string('pengarang');
$table->string('tipe');
$table->timestamps();
$table->string('deskripsi');
$table->date('tgl_publish');
$table->unsignedBigInteger('user_id');
$table->string('file')->nullable();
});
Kolom yang terpenting adalah kolom ‘file’ pada akhir
table. Kolom itu yang nanti ktia gunakan untuk menyimpan nama file yang kita
mau.
Kemudian kita perlu buat Model dan Controller.
php artisan make:controller MateriController --resource
php artisan make:model Materi
Untuk isi modelnya kita akan cuma deklarasi table
nya aja. Jadi isi dari model seperti ini
class Materi extends Model
{
protected $table='materi';
}
Jangan lupa
definisikan route untuk akses
controller MateriController di routes/web.php.
Kalian bisa gunakan Route::resource('/materi','MateriController');
biar simple.
Make Views
Seperti yang kalian tahu, struktur normal view
punya laravel itu ada di folder resource/ views. Tapi disini aku buat folder baru lagi didalam folder views dengan nama materi. Jadi struktur yang view yang sekarang itu
ada di resource/ views/ materi. Kenapa dibuat gini? Sebenernya dibuat gini cuma
buat ngelompokin aja. Bedanya cuma pas mau manggil view nya, kita harus panggil
nama foldernya juga.
Disini ada 2 views yang mau dibuat. Yang pertama adalah index.blade.php yang digunakan untuk menampilkan data materi
secara keseluruhan. Dan yang kedua adalah create.blade.php yang digunakan sebagai form upload. Di form inilah nanti kita
mulai buat fungsi upload file nya. Oh ya, sebelumnya data di databaseku udah
ada isinya, soalnya aku pake database bekas artikel sebelumnya yang tentang
seeder dan factory.
Untuk file index.blade.php.
Digunakan untuk menampilkan data dari materi. Kemudian untuk create.blade.php.
Seperti yang bisa kalian lihat, disana
terdapat form dengan beberapa input. Inti dari artikel ini ada pada input
terakhir, yaitu tag input dengan type ‘file’. Dan jangan lupa untuk menambahkan
enctype="multipart/form-data" didalam tag form agar form dapat memproses
file.
MateriController
Sebelumnya kita udah buat controller dengan
menggunakan --resource yang artinya kita
akan mendapatkan template function CRUD berupa index(), create(), store(),show(), edit(), update(), destroy(). Tapi sekarang kita cuma pake 3 yaitu index(), create(), store().
Pada function index() kita akan menampilkan
views index.blade.php dengan data dari table
Materi.
$materis = Materi::all();
Kalo table kalian udah ada
isinya, nanti hasilnya bakal kaya gambar diatas. Tapi kalo table kalian kosong,
ga akan ketampil apapun.
Selanjutnya kita ke
function create() tempat
dimana kita akan menampilkan form. Seperti yang udah aku bilang, disini aku
pake data dari artikel sebelumnya, yaitu artikel seeder dan factory. Dari
artikel tersebut, aku udah punya beberapa data yang ada di table Materi dan Users. Dan lagi, aku udah punya foreign key yang udah aku deklarasiin di table materi yaitu pada
kolom ‘user_id’. Jadi pada saat kita akan menampilkan form inputnya, aku juga
akan mengambil data user buat aku masukin di dropdown ‘pengarang’.
//Mengambil data user
$users = User::all();
return view('materi.create',['users' => $users]);
Tampilannya akan jadi
seperti gambar diatas.
Selanjutnya adalah function
store(). Dalam function ini kita
akan buat validator untuk inputnya kemudian baru ke pengolahan filenya.
//jalankan validator
$validator = Validator::make($request->all(), [
'judul' => 'required|max:255',
'pengarang' => 'required',
'tipe' => 'required',
'deskripsi' => 'required',
'file' => 'required',
]);
if ($validator->fails()) {
return redirect()
->back()
->withErrors($validator)
->withInput();
}
//mendapatkan data file
$foto = $request->file('file');
//mengubah format nama file
$foto_name = Str::random(10).'.'.$foto->getClientOriginalExtension();
//tempat menyimpan file
$path = 'images';
//perintah untuk menyimpan file
$foto->move($path,$foto_name);
//menggunakan id user untuk mendapatkan nama pengarang
$user = User::find($request->pengarang);
//save data
$new_data = new Materi;
$new_data->judul = $request->judul;
$new_data->pengarang = $user->name;
$new_data->tipe = $request->tipe;
$new_data->deskripsi = $request->deskripsi;
$new_data->tgl_publish = now();
$new_data->user_id = $request->pengarang;
$new_data->file = $foto_name;
$new_data->save();
return redirect(route('materi.index'));
Sebenernya validator-nya ga
berpengaruh banget. Fokus kita ada setelah validator nya selesai. Logika dari
input file ini adalah dimulai dari mendapatkan file menggunakan $request->file('name_of_input'). Kemudian mengubah nama
filenya menjadi 10 karakter random ditambahkan dengan ekstensi filenya
menggunakan Str::random(10).'.'.$foto->getClientOriginalExtension(). Kenapa namanya dibuah? biar
memperkecil nama yang sama. Kemudian file akan di pindahkan ke direktori
laravel menggunkaan $foto->move($path,$foto_name).
Kemana filenya dipindahkan? Ke direktori yang udah kita deklarasi di $path = 'images'. Path itu akan menuju ke
direktori public/images/.
Selanjutnya adalah
menyimpan data berupa nama file kedalam database agar bisa dipanggil.
Komentar
Posting Komentar