PHP Büyük boyuttaki dosyalar ile upload hatası

MRsuffix Berat

Decapat
Katılım
11 Ekim 2021
Mesajlar
251
Çözümler
1
Daha fazla  
Sistem Özellikleri
Lenovo Gaming 3
10.Nesil Core i5 10300H
16Gb RAM
1Tb HDD
256SSD
GTX1650Ti 4Gb
Windows 11 64bit
Cinsiyet
Erkek
Merhaba,
Ben bir PHP ile upload sistemi yaptım. Küçük dosyalarda sıkıntı yok ama büyük boyuttaki dosyalarda sıkıntı çıkıyor. Örnek olarak 150 MB'lik bir dosya upload ediyorum %10'a gelince duruyor upload işlemi.
Upload işleminin form sayfası index upload eden sayfa ise upload.php sayfası. Sizce nerede hata yapıyorum? Kendim yapamadım ChatGPT yapamadı gemini yapamadı kaldım böyle.
Upload.php:
PHP:
// Dosya yükleme işlemini gerçekleştir
if (isset($_FILES['file']) && isset($_POST['stock']) && isset($_POST['max_downloads'])) {
  $fileName = $_FILES['file']['name'];
  $fileTmpName = $_FILES['file']['tmp_name'];
  $fileType = $_FILES['file']['type'];
  $fileSize = $_FILES['file']['size'];
  $fileError = $_FILES['file']['error'];

  $stock = $_POST['stock'];
  $maxDownloads = $_POST['max_downloads'];

  // Dosya yükleme işlemi
  if ($fileError === 0) {
    // Dosya hedef yolunu belirle
    $fileDestination = 'uploads/' . $fileName;

    // Dosyayı hedefe taşı
    if (move_uploaded_file($fileTmpName, $fileDestination)) {
      // Dosya başarıyla yüklendiğinde veritabanına bilgileri kaydet
      $sql = "INSERT INTO files (file_name, stock, max_downloads) VALUES ('$fileName', '$stock', '$maxDownloads')";
      if ($conn->query($sql) === TRUE) {
        // Yeni dosyanın ID'sini al
        $fileId = $conn->insert_id;

        // Tokenleri oluştur ve veritabanına kaydet
        $tokens = [];
        for ($i = 0; $i < $stock; $i++) {
          $token = bin2hex(random_bytes(16));
          $tokens[] = $token;

          // Tokenleri veritabanına kaydet
          $tokenSql = "INSERT INTO tokens (file_id, token, download_limit) VALUES ('$fileId', '$token', '$maxDownloads')";
          if ($conn->query($tokenSql) !== TRUE) {
            echo '<div class="alert alert-danger alert-dismissible">
                    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                    <h5><i class="icon fas fa-ban"></i> Hata!</h5>
                    Token oluşturma sırasında bir hata oluştu. Tekrar deneyin.
                  </div>';
            exit;
          }
        }

        // Dosyanın indirme linklerini oluştur
        $downloadLinksFileContent = "";
        foreach ($tokens as $token) {
          $downloadLinksFileContent .= $websitedomain . "/download.php?file-name=$fileName&token=$token\n";
        }
        $tokenFilePath = "tokens/token-$fileName.txt";
        file_put_contents($tokenFilePath, $downloadLinksFileContent);

        echo '<div class="alert alert-success alert-dismissible">
                <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                <h5><i class="icon fas fa-check"></i> Başarılı!</h5>Dosya Yükleme Başarılı!
              </div>';
      } else {
        // Veritabanına kaydetme hatası
        echo '<div class="alert alert-danger alert-dismissible">
                <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                <h5><i class="icon fas fa-ban"></i> Hata!</h5>
                Dosya yükleme sırasında bir hata oluştu. Tekrar deneyin.
              </div>';
      }
    } else {
      // Dosya taşıma hatası
      echo '<div class="alert alert-danger alert-dismissible">
              <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
              <h5><i class="icon fas fa-ban"></i> Hata!</h5>
              Dosya yüklenirken bir hata oluştu. Tekrar deneyin.
            </div>';
    }
  } else {
    // Dosya yükleme hatası
    echo '<div class="alert alert-danger alert-dismissible">
            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
            <h5><i class="icon fas fa-ban"></i> Hata!</h5>
            Dosya yüklenirken bir hata oluştu. Tekrar deneyin.
          </div>';
  }
} else {
  // Dosya bilgileri eksik
  echo '<div class="alert alert-danger alert-dismissible">
          <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
          <h5><i class="icon fas fa-ban"></i> Hata!</h5>
          Dosya bilgileri eksik. Tekrar deneyin.
        </div>';
}

// Veritabanı bağlantısını kapat
$conn->close();
?>
 

Buradaki dokumana gore false return ettiginde warning de veriyor olmasi gerekiyor.
Nasil bir warning aliyorsun?

"If from is a valid upload file, but cannot be moved for some reason, no action will occur, and move_uploaded_file() will return false. Additionally, a warning will be issued."

PHP implementasyonunu bilmiyorum ama genel olarak yuksek boyutlu dosyalarda I/O islemi yaparken stream temelli gitmek gerekiyor memory kullanimini dengelemek icin. Eger in-memory file processing yapiyorsa bundan dolayi sorun olusmus olabilir. Ama root cause u bilebilmek icin dokumande gecen warning i anlamak gerekiyor, yoksa tahminle bu is olmaz.
 

Buradaki dokümana gore false return ettiginde warning de veriyor olmasi gerekiyor.
Nasil bir warning aliyorsun?

"If from is a valid upload file, but cannot be moved for some reason, no Action will occur, and move_uploaded_file() will return false. Additionally, a warning will be issued."

PHP implementasyonunu bilmiyorum ama genel olarak yuksek boyutlu dosyalarda I/O islemi yaparken stream temelli gitmek gerekiyor Memory kullanimini dengelemek icin. Eger in-Memory file processing yapiyorsa bundan dolayi sorun olusmus olabilir. Ama root cause u bilebilmek icin dokümande gecen warning i anlamak gerekiyor, yoksa tahminle bu is olmaz.

Herhangi bir uyarı almıyorum. Upload işlemi aniden duruyor.
 
Çok büyük ihtimalle Max Execution süresini aştığı için işlemi kesiyor. Ya da Max Upload Size, bunları php.ini üzerinde yükselterek sorunu aşabileceğinizi düşünüyorum.
 

Geri
Yukarı