
MySQL ile PHP File Upload
Dosya yükleme web uygulamalarında yaygın bir özelliktir. Kullanıcıların profil resimleri, özgeçmişler, PDF belgeleri, ürün resimleri, ekler, sertifikalar veya galeri fotoğrafları yüklemeleri gerekebilir. PHP, yüklenen dosyaları alabilir, bunları doğrulayabilir, güvenli bir klasöre taşıyabilir ve bilgilerini bir MySQL veritabanında saklayabilir.
file upload, MySQL ile birleştirildiğinde, yüklenen dosyanın kendisi genellikle sunucudaki bir klasörde saklanır; veritabanı ise dosya adı, dosya yolu, dosya türü, dosya boyutu ve yükleme tarihi gibi bilgileri depolar.
Bu makalede, MySQL ile PHP file upload, HTML yükleme formları, PHP yükleme işleme, doğrulama, dosya türü kontrolleri, dosya boyutu kontrolleri, güvenli dosya adları, MySQL'da dosya yollarını saklama, yüklenen dosyaları görüntüleme, güncelleme dahil olmak üzere ayrıntılı olarak açıklanmaktadır. yüklenen dosyalar, yüklenen dosyaların silinmesi ve en iyi güvenlik uygulamaları.
PHP File Upload Nasıl Çalışır?
Kullanıcı bir dosyayı seçip bir form gönderdiğinde, tarayıcı dosyayı sunucuya gönderir. PHP, yüklenen dosyayı$_FILESsüper küresel.
Yükleme işlemi genellikle şu adımları takip eder:
Kullanıcı HTML formundan bir dosya seçer.
Form dosyayı kullanarak gönderirPOSTveçok parçalı/form-veri.
PHP yüklenen dosyayı şuradan okur:$_FILES.
PHP, yükleme hatası durumunu, boyutunu, uzantısını ve MIME türünü doğrular.
PHP güvenli yeni bir dosya adı oluşturur.
PHP, dosyayı geçici depolama alanından kalıcı bir yükleme klasörüne taşır.
PHP, dosya bilgilerini MySQL'da saklar.
Uygulama daha sonra dosyayı görüntüleyebilir, indirebilir, güncelleyebilir veya silebilir.
Bu iş akışının konsepti basittir ancak file upload dikkatli bir şekilde ele alınmalıdır çünkü karşıya yüklenen dosyalar doğrulamanın zayıf olması durumunda ciddi güvenlik riskleri oluşturabilir.
Yüklenen Dosyalar için Veritabanı Tablosu
Dosya bilgilerini MySQL'da saklamadan önce bir veritabanı tablosuna ihtiyacınız vardır. Yaygın bir tablo adıyüklemelerveyadosyalar.
CREATE TABLE uploads (
id INT AUTO_INCREMENT PRIMARY KEY,
original_name VARCHAR(255) NOT NULL,
stored_name VARCHAR(255) NOT NULL,
file_path VARCHAR(500) NOT NULL,
mime_type VARCHAR(150) NOT NULL,
file_size INT NOT NULL,
extension VARCHAR(20) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);orijinal_adısütunu, kullanıcı tarafından yüklenen orijinal adı saklar.saklanan_adısütunu, sunucuda kullanılan güvenli oluşturulan dosya adını saklar.
dosya_yolusütunu dosyanın göreceli yolunu saklar.mime_typesütunu algılanan dosya türünü saklar.dosya_boyutusütunu dosya boyutunu bayt cinsinden saklar.
Tam dosya içeriğini doğrudan MySQL içinde depolamak yerine dosya yolunu veritabanında saklamak genellikle daha iyidir. Dosyaları diskte ve meta verileri veritabanında saklamak birçok web uygulaması için daha basit ve daha verimlidir.
PDO Veritabanı Bağlantısı
PHP, PDO kullanılarak MySQL'ya bağlanabilir. PDO, yüklenen dosya bilgilerinin veritabanına güvenli bir şekilde eklenmesi için önemli olan prepared statements'yu destekler.
Adlı bir dosya oluşturundb. php:
<?php
$host = "localhost";
$dbname = "php_uploads";
$username = "root";
$password = "";
try {
$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$username,
$password
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $exception) {
die("Database connection failed.");
}
?>Üretimde, veritabanı kimlik bilgileri genel dizinin dışındaki ortam değişkenlerinde veya yapılandırma dosyalarında saklanmalıdır.
utf8mb4Çok dilli metni doğru şekilde desteklediği için karakter kümesi önerilir.
HTML File Upload Formu
Dosyaları yüklemek için HTML formunun kullanılması gerekiryöntem = "gönder"veenctype = "çok parçalı/form-veri". Doğru enctype olmadan dosya düzgün şekilde gönderilmeyecektir.
<form method="post" action="upload.php" enctype="multipart/form-data">
<label>Choose file</label>
<input type="file" name="uploaded_file">
<button type="submit">Upload</button>
</form>Giriş adıyüklenen_dosyadosyaya erişmek için PHP tarafından kullanılacaktır.$_FILES["yüklenen_dosya"].
Yalnızca görsel yüklemeleri için form şunu kullanabilir:kabul etKullanıcı deneyimini iyileştirmeye yönelik özellik.
<input type="file" name="uploaded_file" accept="image/jpeg,image/png,image/webp">Accept özelliği, tarayıcının ilgili dosya türlerini göstermesine yardımcı olur, ancak bu bir güvenlik özelliği değildir. PHP’nin yine de dosyayı sunucu tarafında doğrulaması gerekiyor.
$_FILES'ı Anlamak
Bir dosya yüklendiğinde, PHP bu dosyayla ilgili bilgileri$_FILESdizi.
<?php
print_r($_FILES["uploaded_file"]);
?>Yüklenen dosya bilgileri genellikle şunları içerir:
isim:kullanıcının bilgisayarındaki orijinal dosya adı.
tür:tarayıcı tarafından gönderilen MIME türü.
tmp_adı:Yüklenen dosyanın sunucudaki geçici konumu.
hata:yükleme hata kodu.
boyut:bayt cinsinden dosya boyutu.
tmp_namePHP ilk önce yüklenen dosyaları geçici olarak sakladığından değer önemlidir. Dosyayı kalıcı olarak saklamak için şunu kullanarak taşımanız gerekir:move_uploaded_file().
Temel PHP File Upload
Temel bir yükleme komut dosyası dosyayı alır ve onu bir yükleme klasörüne taşır.
<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$tmpName = $_FILES["uploaded_file"]["tmp_name"];
$fileName = $_FILES["uploaded_file"]["name"];
move_uploaded_file($tmpName, __DIR__ . "/uploads/" . $fileName);
echo "File uploaded.";
}
?>Bu basit örnek temel fikri göstermektedir ancak gerçek uygulamalar için yeterince güvenli değildir. Orijinal dosya adını kullanır ve dosya türünü, boyutunu veya yükleme hatasını doğrulamaz.
Gerçek projelerde, doğrulama olmadan asla orijinal dosya adına veya dosya uzantısına güvenmeyin. Güvenli bir yükleme sistemi yeni bir dosya adı oluşturmalı ve yüklenen dosyayı dikkatli bir şekilde doğrulamalıdır.
Yükleme Hatalarını Kontrol Etme
PHP, yükleme hata kodlarını sağlar$_FILES["dosya"]["hata"]. Yüklenen dosyayı işlemeden önce daima bu değeri kontrol edin.
<?php
$error = $_FILES["uploaded_file"]["error"];
if ($error !== UPLOAD_ERR_OK) {
echo "Upload failed.";
exit;
}
?>Yaygın yükleme hataları şunları içerir:
UPLOAD_ERR_OK:yükleme başarıyla tamamlandı.
UPLOAD_ERR_INI_SIZE:dosya php. ini'deki upload_max_filesize ayarını aşıyor.
UPLOAD_ERR_FORM_SIZE:dosya formdaki MAX_FILE_SIZE değerini aşıyor.
UPLOAD_ERR_PARTIAL:dosyanın yalnızca bir kısmı yüklendi.
UPLOAD_ERR_NO_DOSYA:hiçbir dosya yüklenmedi.
Yükleme hatalarını kontrol etmek, daha iyi iletiler göndermenize ve eksik veya geçersiz dosyaların işlenmesini önlemenize yardımcı olur.
Dosya Boyutunun Doğrulanması
Dosya boyutu doğrulaması, kullanıcıların çok büyük dosyalar yüklemesini engeller. Büyük dosyalar depolama alanını boşa harcayabilir, sunucuyu yavaşlatabilir veya barındırma sınırlarını aşabilir.
Aşağıdaki örnek, 2 MB'a kadar dosyalara izin verir:
<?php
$maxSize = 2 * 1024 * 1024;
$fileSize = $_FILES["uploaded_file"]["size"];
if ($fileSize > $maxSize) {
echo "File is too large. Maximum size is 2 MB.";
exit;
}
?>Dosya boyutu bayt cinsinden ölçülür. İfade2*1024*10242 megabayt anlamına gelir.
Gerçek projelerde izin verilen dosya boyutu kullanım durumuna bağlıdır. Profil resimleri 1 veya 2 MB ile sınırlı olabilir, PDF belgeleri veya özgeçmişler ise daha büyük boyutlara izin verebilir.
Dosya Uzantısı Doğrulanıyor
Dosya uzantısı, jpg, png, pdf veya docx gibi dosya adında son noktadan sonraki kısımdır. Uzantı doğrulama, yüklemelerin izin verilen dosya türleriyle sınırlandırılmasına yardımcı olur.
<?php
$allowedExtensions = ["jpg", "jpeg", "png", "webp", "pdf"];
$originalName = $_FILES["uploaded_file"]["name"];
$extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
if (!in_array($extension, $allowedExtensions, true)) {
echo "This file extension is not allowed.";
exit;
}
?>Uzantı doğrulaması faydalıdır ancak tek kontrol bu olmamalıdır. Bir dosya sahte bir uzantıyla yeniden adlandırılabilir. Daha güçlü doğrulama için MIME türünü de kontrol edin.
MIME Türünü Doğrulama
MIME türü, image/jpeg, image/png, application/pdf veya image/webp gibi bir dosyanın gerçek türünü tanımlar. PHP, MIME türünü aşağıdakileri kullanarak algılayabilir:finfo_file().
<?php
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($_FILES["uploaded_file"]["tmp_name"]);
$allowedMimeTypes = [
"image/jpeg",
"image/png",
"image/webp",
"application/pdf"
];
if (!in_array($mimeType, $allowedMimeTypes, true)) {
echo "This file type is not allowed.";
exit;
}
?>MIME türü doğrulaması, tarayıcı tarafından sağlananlara güvenmekten daha güçlüdür$_FILES["tür"]değer çünkü dosya içeriğini daha doğrudan inceler.
Resim yüklemeleri için aşağıdakiler gibi resme özel kontrolleri de kullanabilirsiniz:getimagesize()Dosyanın gerçek bir görüntü olduğunu onaylamak için.
Güvenli Dosya Adları Oluşturma
Orijinal dosya adını kullanmak riskli olabilir. Boşluklar, özel karakterler, yinelenen adlar veya güvenli olmayan modeller içerebilir. Daha iyi bir yaklaşım, yeni bir rastgele dosya adı oluşturmaktır.
<?php
$extension = "jpg";
$storedName = bin2hex(random_bytes(16)) . "." . $extension;
?>Bu, tahmin edilmesi zor ve mevcut dosyalarla çakışması muhtemel olmayan rastgele bir dosya adı oluşturur.
Ayrıca bir önek de ekleyebilirsiniz:
<?php
$storedName = "upload_" . time() . "_" . bin2hex(random_bytes(8)) . "." . $extension;
?>Güvenli dosya adları, mevcut dosyaların üzerine yazılmasını önlemeye ve kullanıcı tarafından sağlanan dosya adlarından kaynaklanan sorunları azaltmaya yardımcı olur.
Yüklenen Dosyaları Taşıma
Doğrulamanın ardından yüklenen dosya, geçici konumundan kalıcı bir yükleme dizinine taşınmalıdır.move_uploaded_file().
<?php
$uploadDir = __DIR__ . "/uploads/";
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
$destination = $uploadDir . $storedName;
if (!move_uploaded_file($_FILES["uploaded_file"]["tmp_name"], $destination)) {
echo "Failed to move uploaded file.";
exit;
}
echo "File moved successfully.";
?>fonksiyonmove_uploaded_file()yüklenen dosyalar için özel olarak tasarlanmıştır ve dosyanın geçerli bir yükleme işleminden geldiğinden emin olunmasına yardımcı olur.
Yükleme dizini doğru izinlere sahip olmalıdır. Uygulama tarafından yazılabilir olmalı ancak yüklenen PHP komut dosyalarının yürütülmesine izin vermemelidir.
Dosya Yolunu MySQL'da Saklamak
Dosya başarıyla taşındıktan sonra bilgilerini veritabanında saklayın. Meta verileri güvenli bir şekilde eklemek için hazırlanmış bir ifadeyi kullanın.
<?php
require "db.php";
$originalName = $_FILES["uploaded_file"]["name"];
$fileSize = $_FILES["uploaded_file"]["size"];
$filePath = "uploads/" . $storedName;
$statement = $pdo->prepare("
INSERT INTO uploads (original_name, stored_name, file_path, mime_type, file_size, extension)
VALUES (:original_name, :stored_name, :file_path, :mime_type, :file_size, :extension)
");
$statement->execute([
"original_name" => $originalName,
"stored_name" => $storedName,
"file_path" => $filePath,
"mime_type" => $mimeType,
"file_size" => $fileSize,
"extension" => $extension
]);
echo "File uploaded and saved in database.";
?>Veritabanı artık yüklenen dosyayla ilgili bilgileri içeriyor. Bu, dosyaları listelemeyi, görüntüleri görüntülemeyi, belgeleri indirmeyi, yüklemeleri silmeyi veya dosyaları kullanıcılara ve kayıtlara bağlamayı mümkün kılar.
Yükleme Komut Dosyasını Tamamla
Aşağıdaki örnek, doğrulamayı, güvenli adlandırmayı, dosya taşımayı ve veritabanı eklemeyi tek bir yükleme komut dosyasında birleştirir.
<?php
require "db.php";
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
echo "Invalid request.";
exit;
}
if (!isset($_FILES["uploaded_file"])) {
echo "No file was uploaded.";
exit;
}
$file = $_FILES["uploaded_file"];
if ($file["error"] !== UPLOAD_ERR_OK) {
echo "Upload error.";
exit;
}
$maxSize = 2 * 1024 * 1024;
if ($file["size"] > $maxSize) {
echo "File is too large.";
exit;
}
$allowedExtensions = ["jpg", "jpeg", "png", "webp", "pdf"];
$allowedMimeTypes = [
"image/jpeg",
"image/png",
"image/webp",
"application/pdf"
];
$originalName = $file["name"];
$extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
if (!in_array($extension, $allowedExtensions, true)) {
echo "File extension is not allowed.";
exit;
}
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($file["tmp_name"]);
if (!in_array($mimeType, $allowedMimeTypes, true)) {
echo "File type is not allowed.";
exit;
}
$storedName = bin2hex(random_bytes(16)) . "." . $extension;
$uploadDir = __DIR__ . "/uploads/";
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
$destination = $uploadDir . $storedName;
if (!move_uploaded_file($file["tmp_name"], $destination)) {
echo "Failed to save uploaded file.";
exit;
}
$filePath = "uploads/" . $storedName;
$statement = $pdo->prepare("
INSERT INTO uploads (original_name, stored_name, file_path, mime_type, file_size, extension)
VALUES (:original_name, :stored_name, :file_path, :mime_type, :file_size, :extension)
");
$statement->execute([
"original_name" => $originalName,
"stored_name" => $storedName,
"file_path" => $filePath,
"mime_type" => $mimeType,
"file_size" => $file["size"],
"extension" => $extension
]);
echo "File uploaded successfully.";
?>Bu komut dosyası, hataları, boyutu, uzantıyı, MIME türünü, dosya adını, yükleme dizinini ve veritabanı eklemeyi doğruladığı için temel bir yükleme örneğinden çok daha güvenlidir.
Yüklenen Dosyaları Görüntüleme
Dosya bilgilerini MySQL'ya kaydettikten sonra, veritabanından kayıtları seçip bunları bir sayfada görüntüleyebilirsiniz.
<?php
require "db.php";
$statement = $pdo->query("
SELECT id, original_name, file_path, mime_type, file_size, created_at
FROM uploads
ORDER BY id DESC
");
$files = $statement->fetchAll();
?>
<h1>Uploaded Files</h1>
<?php foreach ($files as $file): ?>
<div>
<p><?php echo htmlspecialchars($file["original_name"], ENT_QUOTES, "UTF-8"); ?></p>
<p>Size: <?php echo (int) $file["file_size"]; ?> bytes</p>
<a href="<?php echo htmlspecialchars($file["file_path"], ENT_QUOTES, "UTF-8"); ?>" target="_blank">Open File</a>
</div>
<?php endforeach; ?>Veritabanındaki değerleri görüntülerken şunu kullanın:htmlspecialchars()metin çıktısından güvenli bir şekilde kaçmak için.
Resimler için, MIME türü bir resimse, yüklenen dosyayı bir resim etiketi kullanarak görüntüleyebilirsiniz.
<?php if (str_starts_with($file["mime_type"], "image/")): ?>
<img src="<?php echo htmlspecialchars($file["file_path"], ENT_QUOTES, "UTF-8"); ?>" alt="" width="200">
<?php endif; ?>Bu, galeriler, profil görseli sistemleri, ürün görseli listeleri veya belge yönetimi sayfaları oluşturmayı mümkün kılar.
Yüklenen Dosyaları İndirme
Bazen kullanıcıların dosyalara genel bağlantılar aracılığıyla doğrudan erişmesini istemeyebilirsiniz. Bunun yerine, önce izinleri kontrol eden, ardından dosyayı sunan bir indirme komut dosyası oluşturabilirsiniz.
<?php
require "db.php";
$id = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT);
if (!$id) {
die("Invalid file ID.");
}
$statement = $pdo->prepare("SELECT * FROM uploads WHERE id = :id LIMIT 1");
$statement->execute(["id" => $id]);
$file = $statement->fetch();
if (!$file) {
die("File not found.");
}
$fullPath = __DIR__ . "/" . $file["file_path"];
if (!file_exists($fullPath)) {
die("File missing from server.");
}
header("Content-Type: " . $file["mime_type"]);
header("Content-Disposition: attachment; filename=\"" . basename($file["original_name"]) . "\"");
header("Content-Length: " . filesize($fullPath));
readfile($fullPath);
exit;
?>Bu yaklaşım, dosyalar özel olduğunda ve yalnızca yetkili kullanıcılar tarafından indirilmesi gerektiğinde kullanışlıdır.
Özel dosyaları sunmadan önce, oturum açan kullanıcının dosyaya erişim izninin olup olmadığını kontrol edin.
Yüklenen Dosyayı Güncelleme
Bazı uygulamalarda kullanıcıların, yüklenen mevcut bir dosyayı değiştirmesi gerekir. Örneğin, bir kullanıcı bir profil resmini güncelleyebilir veya bir özgeçmiş belgesini değiştirebilir.
Güncelleme işlemi genellikle şu adımları takip eder:
Veritabanındaki mevcut dosya kaydını bulun.
Yeni yüklenen dosyayı doğrulayın.
Yeni dosyayı yükleme dizinine taşıyın.
Gerekirse eski dosyayı sunucudan silin.
Veritabanı kaydını yeni dosya bilgileriyle güncelleyin.
Basitleştirilmiş bir güncelleme sorgusu şöyle görünebilir:
<?php
$statement = $pdo->prepare("
UPDATE uploads
SET original_name = :original_name,
stored_name = :stored_name,
file_path = :file_path,
mime_type = :mime_type,
file_size = :file_size,
extension = :extension
WHERE id = :id
");
$statement->execute([
"id" => $id,
"original_name" => $originalName,
"stored_name" => $storedName,
"file_path" => $filePath,
"mime_type" => $mimeType,
"file_size" => $fileSize,
"extension" => $extension
]);
?>Dosyaları değiştirirken, yeni dosya başarıyla yüklenip kaydedilene kadar eski dosyayı silmediğinizden emin olun. Bu, yeni yükleme başarısız olursa eski dosyanın kaybolmasını önler.
Yüklenen Dosyaları Silme
Yüklenen bir dosyayı silmek, hem veritabanı kaydını hem de fiziksel dosyayı sunucudan kaldırmalıdır.
<?php
require "db.php";
$id = filter_input(INPUT_POST, "id", FILTER_VALIDATE_INT);
if (!$id) {
die("Invalid file ID.");
}
$statement = $pdo->prepare("SELECT * FROM uploads WHERE id = :id LIMIT 1");
$statement->execute(["id" => $id]);
$file = $statement->fetch();
if (!$file) {
die("File not found.");
}
$fullPath = __DIR__ . "/" . $file["file_path"];
$delete = $pdo->prepare("DELETE FROM uploads WHERE id = :id");
$delete->execute(["id" => $id]);
if (file_exists($fullPath)) {
unlink($fullPath);
}
echo "File deleted successfully.";
?>Gerçek uygulamalarda silme eylemleri kimlik doğrulama, yetkilendirme ve CSRF korumasıyla korunmalıdır.
Dosyalar önemliyse, bunları kalıcı olarak hemen silmek yerine geçici silme mantığını kullanabilirsiniz.
Çoklu Dosya Yüklemeleri
PHP ayrıca birden fazla dosya yüklemesini de gerçekleştirebilir. HTML girişi şunu kullanmalıdır:çokluve ad köşeli parantez kullanmalıdır.
<form method="post" action="upload-multiple.php" enctype="multipart/form-data">
<input type="file" name="files[]" multiple>
<button type="submit">Upload Files</button>
</form>PHP, içinde diziler halinde birden fazla dosya alır$_FILES.
<?php
foreach ($_FILES["files"]["name"] as $index => $name) {
$tmpName = $_FILES["files"]["tmp_name"][$index];
$error = $_FILES["files"]["error"][$index];
$size = $_FILES["files"]["size"][$index];
if ($error !== UPLOAD_ERR_OK) {
continue;
}
// Validate and move each file here
}
?>Her dosya ayrı ayrı doğrulanmalıdır. Form gönderildi diye tüm dosyaların geçerli olduğunu varsaymayın.
Galeriler, ürün görselleri, belge setleri, sertifikalar ve ekler için birden fazla yükleme kullanışlıdır.
Yüklemeleri Kullanıcılara veya Gönderilere Bağlama
Gerçek projelerde yüklenen dosyalar genellikle başka bir kayda aittir. Örneğin profil resmi kullanıcıya, ürün resmi ürüne, ek ise bir mesaja aittir.
Bir ekleme yaparak yüklemeleri kullanıcılara bağlayabilirsiniz.kullanıcı_kimliğisütun.
ALTER TABLE uploads ADD user_id INT NULL;Ardından yüklemeyi eklerken oturum açmış kullanıcının kimliğini saklayın:
<?php
session_start();
$userId = $_SESSION["user_id"];
$statement = $pdo->prepare("
INSERT INTO uploads (user_id, original_name, stored_name, file_path, mime_type, file_size, extension)
VALUES (:user_id, :original_name, :stored_name, :file_path, :mime_type, :file_size, :extension)
");
$statement->execute([
"user_id" => $userId,
"original_name" => $originalName,
"stored_name" => $storedName,
"file_path" => $filePath,
"mime_type" => $mimeType,
"file_size" => $fileSize,
"extension" => $extension
]);
?>Bu, uygulamanın her kullanıcıya yalnızca kendi yüklediği dosyaları göstermesine olanak tanır.
Özel olarak yüklenen dosyaları görüntülemeden, indirmeden, güncellemeden veya silmeden önce daima sahipliği kontrol edin.
Resim Yükleme Önizlemesi
Resim yükleme formları için JavaScript, dosya gönderilmeden önce bir önizleme gösterebilir. Bu, kullanıcı deneyimini iyileştirir ancak sunucu tarafı doğrulaması hala gereklidir.
<input type="file" id="imageInput" name="uploaded_file" accept="image/*">
<img id="preview" src="" alt="" width="200" style="display:none;">
<script>
document.getElementById("imageInput").addEventListener("change", function () {
const file = this.files[0];
if (!file) {
return;
}
const preview = document.getElementById("preview");
preview.src = URL.createObjectURL(file);
preview.style.display = "block";
});
</script>Bu önizleme yalnızca kullanıcının seçilen resmi görmesine yardımcı olur. Dosyanın güvenli olduğunu kanıtlamaz. PHP’nin yüklemeden sonra dosyayı doğrulaması gerekiyor.
Yüklemeler için PHP Yapılandırması
PHP yükleme davranışı sunucu yapılandırmasından da etkilenir. Önemli ayarlar şunları içerir:
dosya_uploads:dosya yüklemelerini etkinleştirir veya devre dışı bırakır.
upload_max_filesize:izin verilen maksimum yüklenen dosya boyutu.
post_max_size:POST isteğinin tamamının maksimum boyutu.
max_file_uploads:bir istekte yüklenebilecek maksimum dosya sayısı.
max_execution_time:maksimum komut dosyası yürütme süresi.
PHP komut dosyanız 10 MB dosyalara izin veriyorsa ancakupload_max_filesize2 MB olarak ayarlandığında sunucu yapılandırması yine de daha büyük dosyaları reddedecektir.
Daha büyük yükleme özellikleri için yapılandırmayı dikkatli bir şekilde ayarlayın ve sınırsız dosya boyutlarına izin vermekten kaçının.
PHP File Upload için Güvenlik Notları
Dosya yükleme, web uygulamalarındaki en hassas özelliklerden biridir. Zayıf bir yükleme sistemi, saldırganların yürütülebilir dosyalar yüklemesine, depolama alanını tüketmesine veya özel dosyalara erişmesine olanak tanıyabilir.
Önemli güvenlik uygulamaları şunları içerir:
Dosyaları işlemeden önce yükleme hatalarını kontrol edin.
İzin verilen dosya uzantılarını sınırlayın.
MIME türünü şunu kullanarak doğrulayın:finfo_file().
Dosya boyutunu sınırlayın.
Güvenli rastgele dosya adları oluşturun.
Orijinal dosya adına güvenmeyin.
PHP dosyalarının veya çalıştırılabilir komut dosyalarının yüklenmesine izin vermeyin.
Mümkün olduğunda özel dosyaları genel dizinin dışında saklayın.
Yüklenenler klasöründe yürütmeyi önleyin.
İşlemleri indirmeden, güncellemeden veya silmeden önce kullanıcı izinlerini kontrol edin.
Formları yüklemek ve silmek için CSRF korumasını kullanın.
HTML'da görüntülerken dosya adlarından kaçının.
Herkese açık görsel yüklemelerinde görselleri yeniden boyutlandırmak, gereksiz meta verileri çıkarmak ve optimize edilmiş sürümleri depolamak da faydalıdır.
MySQL ile File Upload Gerçek Projelerde Nasıl Kullanılır?
MySQL ile dosya yükleme birçok gerçek web uygulamasında kullanılır. Dosya sunucuda veya depolama hizmetinde saklanır ve veritabanı, onu yönetmek için gereken meta verileri tutar.
Yaygın örnekler şunları içerir:
Kullanıcı profili resimleri.
Özgeçmiş veya CV yüklemeleri.
Ürün resimleri.
Blog yazısı kapak görselleri.
Doküman yönetim sistemleri.
Resim galerileri.
Sertifikalar ve akademik belgeler.
Bilet eklerini destekleyin.
Portföy projesi görselleri.
Daha büyük sistemlerde yüklemeler Amazon S3 veya başka bir nesne depolama hizmeti gibi bulut depolama alanında depolanabilirken, MySQL dosya URL'sini ve meta verileri depolar.
Modern PHP Çerçevelerinde File Upload
Laravel gibi modern PHP çerçeveleri, file upload, doğrulama, depolama ve veritabanı entegrasyonu için temiz araçlar sağlar. Laravel dosyaları doğrulayabilir, bunları yerel veya bulut disklerde depolayabilir, yollar oluşturabilir ve yüklemeleri modellere bağlayabilir.
Ancak file upload'yu saf PHP’de öğrenmek hala önemlidir. Nasıl olduğunu anlamanıza yardımcı olur$_FILES, yükleme doğrulaması,move_uploaded_file(), dosya yolları ve veritabanı meta verileri perde arkasında çalışır.
Saf PHP iş akışını anladığınızda çerçeve araçlarını kullanmak daha kolay ve anlaşılır hale gelir.
Sonuç
PHP file upload ile MySQL önemli bir arka uç özelliğidir. Uygulamaların kullanıcılardan dosya almasına, bunları doğrulamasına, sunucuda güvenli bir şekilde saklamasına ve dosya bilgilerini veritabanına kaydetmesine olanak tanır.
Temel adımlar bir yükleme formu oluşturmak, okumak$_FILES, yükleme hatalarını kontrol etme, dosya boyutunu doğrulama, uzantıyı ve MIME türünü doğrulama, güvenli bir dosya adı oluşturma, dosyayı taşıma ve prepared statements kullanarak meta verileri MySQL'da depolama.
Bu konuyu öğrendikten sonra bir sonraki adım, kullanıcı kimlik doğrulaması ve izinleri olan bir profil resmi yükleme sistemi, bir belge yükleme yöneticisi, bir ürün resim galerisi veya özel bir dosya indirme sistemi oluşturarak pratik yapmaktır.

