Php upload dosya okuma hatası

  • Konbuyu başlatan Konbuyu başlatan bygold007
  • Başlangıç tarihi Başlangıç tarihi

bygold007

Üye
Katılım
17 May 2020
Mesajlar
38
Puanları
1
Yaş
37
Herkese merhaba;

Php ile kendi çapımda projeler yapıyorum, windows 11 pro 64 bit ve appserv sunucu kullanıyorum.Localhostta ne yaptıysam dosyayı upload ediyorum sorun yok, upload ettikten sonra ne windows üzerinden nede html kodları ile okuyamıyorum yazamıyorum yetki sorunu yaşıyorum.Bunun için upload dizinine güvenlik seçeneklerinden bütün izinleri verdim upload ettikten sonra sadece dosya üzerinde tekrar bütün izinleri verdim bütün kullanıcılar için ne yaparsam yapayım dosyayı okuyamıyorum ve yazamıyorum okumak derken kullanmak anlamında, mesala bir jpeg dosyayı upload ettim diyelim fotoğrafı ne windowstan klasör içine girip nede url belirtip okuyamıyorum kullanamıyorum yazamıyorum yeni bir sorun değil windows 7 de de aynı sorunu yaşadım ama üstünde fazla durmadım. bugün ise file upload gerekli oldu. yardımcı olabilecek varsa sevinirim.
 
Kod örneği verirsen yardımcı oluruz. Dizin yolu hatası gibi duruyor.
 
index.php
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dosya Yükleme</title>
</head>
<body>

<h2>Dosya Yükle</h2>
<form action="upload.php" method="POST" enctype="multipart/form-data">
<label for="fileToUpload">Dosya Seçin:</label>
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Yükle" name="submit">
</form>

</body>
</html>
------------
upload.php
------------

<?php
// Dosya yükleme işlemi
if (isset($_POST['submit'])) {
$target_dir = "uploads/"; // Dosyaların yükleneceği dizin
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1; // Yükleme başarılı mı kontrol etmek için
$fileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));

// Dosya zaten varsa
if (file_exists($target_file)) {
echo "Üzgünüz, bu dosya zaten mevcut.";
$uploadOk = 0;
}

// Dosya boyutu kontrolü (5MB)
if ($_FILES["fileToUpload"]["size"] > 5000000) {
echo "Üzgünüz, dosyanız çok büyük.";
$uploadOk = 0;
}

// Dosya türünü kontrol et (sadece resim dosyalarını kabul edelim)
$allowedTypes = ["jpg", "jpeg", "png", "gif"];
if (!in_array($fileType, $allowedTypes)) {
echo "Üzgünüz, sadece JPG, JPEG, PNG ve GIF dosyaları kabul edilmektedir.";
$uploadOk = 0;
}

// Yükleme işlemini gerçekleştirme
if ($uploadOk == 0) {
echo "Üzgünüz, dosyanız yüklenemedi.";
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "Dosya ". htmlspecialchars(basename($_FILES["fileToUpload"]["name"])) . " başarıyla yüklendi.";
} else {
echo "Üzgünüz, dosya yüklenirken bir hata oluştu.";
}
}
}
?>

Not: Sistem veya kod güvenliği bir yana şuan tek amacım işlevsellik

Klasör için gerekli kullanıcılara bütün izinleri verdim ancak dosya upload ediliyor ve sanki ayarlar sıfırlanıyor gibi bir hal var. Araştırma yaptım hatta yapay zekaya bile sordum çözüm bulamadım.

Localhostta birde smf kurulu Not defteri olarak kullanıyorum. Oraya dosya upload edince hiçbir sorun yok herşey normal ancak benim amacım mantık anlamak smf gibi büyük bir kod kalabalığının içinde kod ayıklamak pek mantıklı gelmedi sade ve işlevsel kod bulup sonra kendime göre uyarlamak istiyorum.smf nin yapısı malum dosyayı alıyor adını değiştiriyor şifreliyor sonra okurken tekar şifreyi çözüyor vs.vs.
 

Ekli dosyalar

  • upload.webp
    upload.webp
    20 KB · Görüntüleme: 6
Son düzenleme:
Aşağıdaki kodu deneyebilirsin.

Hata mesajlarını echo ile vereceksen exit ile işlemi durdurmalısın. die işlemi durdurur ve mesajı gösterir.
Kod:
<?php
// Yüklemelerin kaydedileceği klasör
$targetDir = "uploads/";

// Klasör yoksa oluştur
if (!is_dir($targetDir)) {
    mkdir($targetDir, 0777, true);
}

// Yüklenen dosyanın bilgileri
$fileName = basename($_FILES["fileToUpload"]["name"]);
$targetFile = $targetDir . uniqid() . "_" . $fileName; // benzersiz isim
$fileType = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));

// İzin verilen dosya türleri
$allowedTypes = ["jpg", "jpeg", "png", "gif", "pdf", "txt"];

// Maksimum dosya boyutu: 5MB
$maxSize = 5 * 1024 * 1024;

if (isset($_POST["submit"])) {

    // Dosya seçilmemişse
    if ($_FILES["fileToUpload"]["error"] == UPLOAD_ERR_NO_FILE) {
        die("Lütfen bir dosya seçin.");
    }

    // Dosya boyutu kontrolü
    if ($_FILES["fileToUpload"]["size"] > $maxSize) {
        die("Dosya çok büyük! Maksimum izin verilen boyut: 5MB");
    }

    // Dosya türü kontrolü
    if (!in_array($fileType, $allowedTypes)) {
        die("Bu dosya türüne izin verilmiyor!");
    }

    // Dosyayı hedef klasöre taşı
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
        echo "Dosya başarıyla yüklendi!<br>";
        echo "Yüklenen dosya: " . htmlspecialchars($fileName) . "<br>";
        echo "Sunucudaki yol: " . $targetFile;
        echo '<img src="' . $targetFile . '" alt="Yüklenen Resim" style="max-width:300px; display:block; margin-top:10px;">';
    } else {
        echo "Dosya yüklenirken bir hata oluştu.";
    }
}

Daha iyisi
Kod:
<?php
// Yüklemelerin kaydedileceği klasör
$targetDir = __DIR__ . "/uploads/";

// Klasör yoksa oluştur
if (!is_dir($targetDir)) {
    mkdir($targetDir, 0755, true);
}

// uploads içine PHP çalışmasını engelle (.htaccess oluştur)
$htaccess = $targetDir . ".htaccess";
if (!file_exists($htaccess)) {
    file_put_contents($htaccess, "php_flag engine off");
}

// Dosya bilgileri
$file = $_FILES["fileToUpload"] ?? null;

if (!$file || $file["error"] === UPLOAD_ERR_NO_FILE) {
    die("Lütfen bir dosya seçin.");
}

// Maksimum 5MB
$maxSize = 5 * 1024 * 1024;
if ($file["size"] > $maxSize) {
    die("Dosya çok büyük! Maksimum boyut: 5MB");
}

// Dosya uzantısı
$originalName = basename($file["name"]);
$sanitizedName = preg_replace("/[^A-Za-z0-9_\-\.]/", "_", $originalName); // temiz ad
$fileExtension = strtolower(pathinfo($sanitizedName, PATHINFO_EXTENSION));

// İzin verilen uzantılar
$allowedExtensions = ["jpg", "jpeg", "png", "gif", "pdf", "txt"];
if (!in_array($fileExtension, $allowedExtensions)) {
    die("Bu dosya uzantısına izin verilmiyor!");
}

// MIME türü doğrulama (gerçek dosya formatını kontrol eder)
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($file["tmp_name"]);

$allowedMime = [
    "jpg"  => "image/jpeg",
    "jpeg" => "image/jpeg",
    "png"  => "image/png",
    "gif"  => "image/gif",
    "pdf"  => "application/pdf",
    "txt"  => "text/plain"
];

if (!isset($allowedMime[$fileExtension]) || $mimeType !== $allowedMime[$fileExtension]) {
    die("Dosya türü geçersiz veya sahte!");
}

// Benzersiz isim ile kaydet
$newFileName = uniqid("upload_", true) . "." . $fileExtension;
$targetFile = $targetDir . $newFileName;

// Dosyayı taşı
if (move_uploaded_file($file["tmp_name"], $targetFile)) {
    echo "Dosya başarıyla yüklendi!<br>";
    echo "Orijinal dosya adı: " . htmlspecialchars($originalName) . "<br>";
    echo "Sunucuya kaydedilen ad: " . htmlspecialchars($newFileName) . "<br>";

    if (in_array($fileExtension, ["jpg", "jpeg", "png", "gif"])) {
        echo '<img src="uploads/' . htmlspecialchars($newFileName) . '" style="max-width:300px; margin-top:10px;">';
    }
} else {
    echo "Dosya yüklenirken bir hata oluştu.";
}
?>
 
Son düzenleme:
Yardımınız için çok teşekkür ederim. Sanırım 777 yapmadığım için hata alıyordum.Upload sorunum kısmen çözüldü upload edilen dosyaya windowsdan erişim için nasıl bir yol izlemem gerekiyor. html ile kullandığımda artık erişim sağlıyorum ancak windowstan açılmıyor dosya
 
Son düzenleme:
Yardımınız için çok teşekkür ederim. Sanırım 777 yapmadığım için hata alıyordum.Upload sorunum kısmen çözüldü upload edilen dosyaya windowsdan erişim için nasıl bir yol izlemem gerekiyor. html ile kullandığımda artık erişim sağlıyorum ancak windowstan açılmıyor dosya
Windowstan erişim derken neyi kastediyorsun. Dosya fiziksel olarak sunucu uygulamanın ana dizini altındaki uploads içinde olacak. Mesela xampp için, c:\xampp\htdocs\ kök dizindir. Altında index.html upload.php ve uploads klasörü bulunur bizim kodlara göre.

Windows veya Linux farketmez. Dosyaya erişirken c:\ şeklinde yani fiziksel path ile erişmeyeceksin. Phpde $_SERVER['DOCUMENT_ROOT'] ve _DIR_ konularına göz at.
 
uploads klasörüne girip windows üzerindeki herhangi bir resim görüntüleme programı ile görüntüleme yapamıyormuyuz. konu artık php ve htmlden çıktı verdiğiniz destek sayesinde kod ve localsunucu kısmını aştım.
Örnek vermek gerekirse ;

index.php diyelim bunun için windows gezgininde c:/appserv/www klasörüne girip notepad++ ile açabiliyoruz. Bir jpg dosyayı upload ettik diyelim bunuda c:/appserv/www/uploads klasörüne girip herhangi bir fotoğraf görüntüleme yazılımı ile açamıyorum. Bu dosyayı program ile açmam mümkün mü?


if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
// Dosya izinlerini değiştirme (okuma izni ver)
chmod($targetFile, 0777);

bunu denedim yine olmadı
 
Son düzenleme:
Klasöre windowstan girip açabilirsin, herhangi bir problem yok. Dosya türü farketmeksizin erişip açabilir okuyabilirsin.
 
Fotoğrafı açmaya çalışınca böyle oluyor.
 

Ekli dosyalar

  • Ekran görüntüsü 2025-12-03 231254.webp
    Ekran görüntüsü 2025-12-03 231254.webp
    17.7 KB · Görüntüleme: 4
Konunun kısaca çözümü belki lazım olan olur,
Dosya upload edilebiliyor haliyle bende dosya upload edildiği için ve daha önceden www klasörüne bütün kullanıcılara tam yetki verdiğimden kullanıcı izinlerine bakmak aklıma bile gelmedi. sonrasında chmod 0777 nin sadece lunix tabanlı sistemlerde çalıştığının bilgisine ulaştım bu durumda php kodları ile bunu yapmak malesef mümkün değil,

if (is_writable($path)) {
echo "Yazma / okuma yetkisi var";
} else {
echo "Yazma / okuma yetkisi yok";
}

Böyle basit bir kontrol kodu buldum ve çalıştırdım. Haliyle okuma yazma yetkisi yok hatası verdi bende çözüme ulaştım www klasörüne yetki vermek yetmiyor ayrıca uploads klasörü içinde tekrar yetkilendirme işleminin yapılması gerekiyor.

Kod mantığı yanlış olabilir ama çalışma sistemi doğru is_writable özelliğine araştırma yaparken ulaştım kendimce böyle birşey oluşturdum basit bir kontrol şekli ama en azından yönlendirmede işe yarıyor. :)
 

Forum istatistikleri

Konular
133,380
Mesajlar
971,000
Kullanıcılar
459,228
Son üye
saidkaradogu

Yeni konular

Geri
Üst