PHP veya JS ile resim yüklerken orantılı küçültme
Ben php de veritabanına görsel yollarken o resmi orantılı küçültmek ve küçülttüğüm resmi hem veri tabanına hemde bir klasöre kaydetmek istiyorum. Nasıl yapabilirim?
Görseli PHP ile boyutlandırmak için örnek
1. Google'a "image library php" yazdığımda karşıma "PHP'de görüntü işlemek için en iyi 5 kütüphane" başlıklı bir yazı çıktı:
designbolts.com/2021/02/04/top-5-libraries-for-image-processing-in-php
2. Bu sayfada incelediğim kütüphaneler içinde biri gözüme kolay göründü: WideImage
wideimage.sourceforge.net
3. Diyelim ki şöyle bir form'dan PHP'ye görseli aktarıyorsunuz:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="my_file">
<button type="submit">Yükle</button>
</form>
Butona basıldığında seçilen görsel upload.php sayfasına "my_file" key'iyle gönderilecek.
4. Görseli upload.php sayfasında yakalayıp kaydedin.
// Bu sayfayı json sonuç dönecek bir sayfa gibi düşünerek,
// kolay sonuç döndürmek için birkaç fonksiyon yazıyorum.
function sendJson($type, $message='') {
header('Content-Type: application/json; charset=utf-8');
echo json_encode(["type"=>$type, "message"=>$message]);
exit();
}
function sendError($message='') { sendJson("error", $message); }
function sendSuccess($message='') { sendJson("success", $message); }
// İşlemler buradan sonra başlıyor...
if(!isset($_FILES['my_file'])) sendError("Dosya bulunamadı.");
$fileName = basename($_FILES['my_file']['name']);
$fileSize = $_FILES['my_file']['size'];
$fileTmpName = $_FILES['my_file']['tmp_name'];
$fileType = $_FILES['my_file']['type'];
$fileExtension = strtolower(end(explode('.',$fileName)));
if (!in_array($fileExtension,['jpeg','jpg','png'])) sendError('Dosya uzantısı geçersiz. Lütfen jpg veya png dosya seçin');
if ($fileSize > 4 * 1024 * 1024) sendError('Dosya boyutu 4 mb üzerinde olamaz.');
$bigImagePath = 'images/'.$fileName; // Bu php dosyasının olduğu aynı yerde images klasörü de olmalı.
$smallImagePath = 'images/small/'.$fileName; // Bu php dosyasının olduğu aynı yerdeki images klasörü altında small klasörü de olmalı.
$uploaded = move_uploaded_file($fileTmpName, $bigImagePath);
if(!$uploaded) sendError('Dosya kaydedilemedi.');
5. WideImage kütüphanesini kullanarak görseli yeniden boyutlandırın ve ilgili klasörlerine kaydedin.
//... önceki kodlardan devam
include "libraries/WideImage.php"; // Bu php dosyasının olduğu aynı yerde libraries klasörü de olmalı. İçine de WideImage.php dosyası eklenmiş olmalı.
$bigImage = null;
$smallImage = null;
try {
$bigImage = WideImage::load($bigImagePath);
$smallImage = WideImage::load($bigImagePath);
}
catch (Exception $e) { sendError("Görsel upload edilememiş."); }
$bigImage = WideImage::load($bigImagePath);
$smallImage = WideImage::load($bigImagePath);
$bigImageResized = $bigImage->resize(1000, 1000, 'inside'); // Görseli 1000x1000 piksellik alana sığacak şekilde boyutlandırır.
$smallImageResized = $smallImage->resize(300, 300, 'inside'); // Görseli 300x300 piksellik alana sığacak şekilde boyutlandırır.
try {
$bigImageResized->saveToFile($bigImagePath);
$smallImageResized->saveToFile($smallImagePath);
}
catch (Exception $e) { sendError("Görsel boyutlandırma başarısız oldu."); }
Kodları test etmeden direkt buraya yazdım. WideImage sınıfını da hiç kullanmadım. Umarım bu şekilde çalışır.
6. Görseli değil, görselin ismini veritabanına kaydedin.
Görselin adı $fileName
değişkeninde bulunuyor. Veritabanına bağlanmak için kullanıyorsunuz bilmiyorum. PDO için örnek vereyim:
//...önceki kodlardan devam
$db = null;
try { $db = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "123456"); }
catch ( PDOException $e ){ sendError("Veritabanına bağlanılamadı."); }
$query = $db->prepare("INSERT INTO gorseller SET dosya_adi = :fileName");
$insert = $query->execute(["fileName"=>$fileName]);
if(!$insert) sendError("Görsel adı veritabanına yazılamadı.");
sendSuccess("Görsel başarıyla kaydedildi.");
Bu örneklerin yardımcı olacağını sanıyorum.
Eğer yanlış yazdığım bir yer bulursanız lütfen belirtin, bu gönderimi düzenleyeyim.