Laravel Upload JPG Convert WEBP dengan Path Dinamis Antara Local dan Hosting
Kendala ini muncul saat upload file berformat JPG. Pada proses upload terdapat proses convert ke WEBP. dimana kendala ini muncul karena proses upload tidak langsung disimpan tapi diconvert dulu menjadi .webp sehingga proses penyimpannanya menggunakan imagewebp() dengan parameter tujuan path ditentukan secara manual.
Awalnya saya menggunakan kode ini untuk menentukan path. dan path ini tidak salah ketika diterapkan di default upload laravel
$destinationPath = public_path().'/images/produk');Path diatas saat dijalankan di local tidak ada masalah, image terupload sesuai tujuan. namun saat dideploy di share hosting. dimana saya meletakkan folder laravel di root sedangankan isi folder public saya letakkan di folder public_html. sehingga saat proses upload image di hosting gambar .webp tersimpan di folder public bukan di public_html
Dan soslusi yang tepat adalah membuat path upload yang dinamis sehingga laravel bisa menentukan path saat di local dan saat di hosting. maka sebagai jembatan komunikasi saya manfaatkan file .env saya menambahkan key APP_PUBLIC_PATH saat di local bernilai public
APP_PUBLIC_PATH=public sedangkan di hosting
APP_PUBLIC_PATH=../public_html sehingga untuk menentukan path tujuan seperti ini
$destinationPath = base_path(env('APP_PUBLIC_PATH','public').'/images/produk');Keterangan:
base_path() : Merujuk pada lokasi root folder laravel
env() : function untuk mengambil value berdasar key yang ada di file .env
parameter 'public' : yaitu path default. Jadi ketika key 'APP_PUBLIC_PATH' tidak ditemukan maka otomatis function env() akan mengembalikan nilai 'public'
contoh implementasi lengkapnya
private function uploadProduk($files){
$list_foto = "";
// Penentuan path tujuan yang dinamis
$destinationPath = base_path(env('APP_PUBLIC_PATH','public').'/images/textile/produk');
if (!file_exists($destinationPath)) {
mkdir($destinationPath, 0755, true);
}
foreach ($files as $file) {
// Nama file tanpa ekstensi
$originalName = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
$filename = time() . '_' . Str::slug($originalName) . '.webp';
// Ambil path sementara dan MIME
$tempPath = $file->getPathname();
$mime = $file->getMimeType();
// Buat image resource sesuai tipe
switch ($mime) {
case 'image/jpeg':
$image = imagecreatefromjpeg($tempPath);
break;
case 'image/png':
$image = imagecreatefrompng($tempPath);
imagepalettetotruecolor($image); // konversi ke true color
imagealphablending($image, true);
imagesavealpha($image, true);
break;
default:
// Skip jika bukan JPEG/PNG
continue 2;
}
// Simpan sebagai WebP
imagewebp($image, $destinationPath . '/' . $filename, 80); // kualitas 80%
imagedestroy($image);
$list_foto .= $filename . ',';
}
return $list_foto;
}