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

MRsuffix Berat

Hectopat
Katılım
11 Ekim 2021
Mesajlar
272
Çözümler
1
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.
 

Technopat Haberler

Yeni konular

Geri
Yukarı