Büyük. PDF Dosyalarını 2MB Çalışma İnce altında Orta BLOB Via PHP, Files gibi MySQL Veritabanı için yükleniyor değil

5 Cevap php

Ben yüklemek için bir PHP komut dosyası geliştiriyorum. PDF belgeleri bir MySQL veritabanı içine orta BLOB'ları olarak PHP ile. Komut ayrıca kullanıcıların dosyaları ve açık / onları indirmek için arama yapmanızı sağlar ama senaryonun parçası benim konuyla alakalı olduğunu sanmıyorum. Komut az 2 MB dosyaları ile çalışıyor ancak en kısa sürede deneyin ve daha fazla 2 MB bir şey değildir, bir dosya upload olarak benim içerik (Orta BLOB) sütun girecek ve mim türü için hiçbir değeri yoktur. Ben zaten 1 MB varsayılan değeri 4 MB MySQL sunucusu için max_packet_size artan denedim. Ben de doğru değerler php.ini güncelledik, ben düşünüyorum. Ben 4MB, 16 MB 4 MB ve memory_limit için post_max_size için upload_max_size ayarlayın. Bu senaryoyu dikkate bol bir intranet üzerinde bir iç uygulama için gibi görünüyor 60 saniye varsayılan çünkü ben gerçekten olsa max_input_time ile denediği değil.

Ben de errorInfo () ve errorCode () ve her iki 0'lar ile (hiçbir hata) ile benim komut PDO nesnesi hataları yakalamak için çalıştık.

İşte benim komut dosyası yükleme bölümü:

if ($key == 'upload')
{
	set_time_limit(0);
	$_SESSION['upload'] = $value;

	if ($_FILES['userfile']['name'])
	{
		$fileName = $_FILES['userfile']['name'];
		$tmpName  = $_FILES['userfile']['tmp_name'];
		$fileSize = $_FILES['userfile']['size'];
		$fileType = $_FILES['userfile']['type'];
		$docType = $_POST['docType'];
		$netKey = $_POST['netKey'];
		$fp       = fopen($tmpName, 'r');
		$content  = fread($fp, filesize($tmpName));
		$content  = addslashes($content);
        fclose($fp);

        $_SESSION['filetype'] = $fileType;

		if(!get_magic_quotes_gpc())
		{
    		$fileName = addslashes($fileName);
		}
		$sqlCheck = "SELECT id, name, documentType, networkKey FROM upload WHERE active='1'";
		foreach ($dbh->query($sqlCheck) as $row)
		{
			if (($row['name'] == $fileName) && ($row[networkKey] == $netKey) && ($row['documentType'] == $docType)) 
			{
				$_SESSION['updateRow'] = $row['id'];
			}

		}

		if ($_SESSION['updateRow'])
			{
				$deactivateDuplicate = "UPDATE upload SET active = 0, modifiedBy = '".strtoupper($_SERVER['REMOTE_USER'])."', modifiedDate = Now() WHERE id = '".$_SESSION['updateRow']."' AND active ='1'";
				$dbh->query($deactivateDuplicate);
				$_SESSION['sql'] = "SELECT id, name, documentType, type, size, networkKey, modifiedBy, modifiedDate, active FROM upload WHERE active = '1'";
				$_SESSION['uploadSearch'] =	1;
				$_SESSION['updateRow'] = 0;
			}
			$values = "'".$fileName."','".$docType."','".$fileType."','".$content."','".$fileSize."','".$netKey."','".strtoupper($_SERVER['REMOTE_USER'])."', Now(), 1";
			$sqlUpload = "INSERT INTO upload (name, documentType, type, content, size, networkKey, modifiedBy, modifiedDate, active) VALUES (".$values.")";
			$dbh->query($sqlUpload);

			$_SESSION['sql'] = "SELECT id, name, documentType, type, size, networkKey, modifiedBy, modifiedDate, active FROM upload WHERE active = '1'";
			$_SESSION['uploadSearch'] =	1;


	}
}

Ve burada daha küçük bir dosya çalıştığını gösteren uygulamanın ön uç ve daha büyük bir dosya değildir. Dosya deneme.pdf az 1 MB ve dosya test.pdf 2.5 MB.

http://www.imagechicken.com/viewpic.php?p=1255628359017775300&x=png

Ben img etiketleri kullanılmış olurdu ama ne yazık ki ben yeni bir kullanıcı değilim ve izin verilmez.

The next thing I am going to look for is a setting in Apache that limits file sizes. I am new to LAMP so any tips would be great. Thanks

5 Cevap

Aslında sorunu sabit. Ben php.ini ve my.cnf burada önerilen ama ben de PDO için bir ayarı değiştirmek için gerekli olan tüm değerleri değişti.

I changed: PDO::MYSQL_ATTR_MAX_BUFFER_SIZE (integer) Maximum buffer size. Defaults to 1 MiB.

Bu PDO nesnesi olsa çalışmaya oluşturulduğunda ayarlanmalıdır. Tüm şimdi iyi.

(Ben 4MB olduğunu düşünüyorum) HTTP isteği sınırlamalar karşı koşarak olabilir, veya HTTP isteği dışında timming olabilir. Ben daha önce bu sorunu içine çalıştırmak. Maksimum yükleme boyutu için php.ini dosyasına @ bakmak isteyebilirsiniz.

Yasal Uyarı: D: Ben bir PHP geliştiricisi değilim

Yani her şeyi tekrarlamak için ben üzerinde çalışıyordu şey üzerinde dosya gönderimine> 1MB sağlamak amacıyla ayarlamak zorunda inanıyorum:

php.ini

  • Değişti post_max_size (I 15MB dosya yüklemelerini istedi, bu yüzden sadece durumda 20M olarak ayarlayın)
  • upload_max_filesize 15M olarak değiştirildi
  • max_execution_time 60 Sol at
  • max_input_time 60 Sol at
  • default_socket_timeout 60 Sol at

my.ini

  • max_allowed_packet 15M olarak değiştirildi

PHP Code

  • : benim PDO çağrı değişti

    new PDO("mysql:host=$host;dbname=$db_name", $db_username, $db_password, array (PDO::MYSQL_ATTR_MAX_BUFFER_SIZE=>15*1024*1024))

Bir mySQL sınırı haline çalışıyor olabilir.

MySQL aşağıdaki çalıştırın:

show variables like 'max_allowed_packet'

That will show you your current setting. The default is 1047552 bytes.

This can be changed with your my.cnf file. Simply add

set-variable = max_allowed_packet=2M

veya her ne boyutu gerekli ve MySQL yeniden başlatın.

EDIT:
What about

<input type="hidden" name="MAX_FILE_SIZE" value="xxx" />

Bu sorunun bir parçası olabilir?

Paylaşılan (MySQL conf dosyaları, vb değişiklik yapamazsınız nerede) barındıran bu yapmak için çalışıyorsanız, Google'ın 'mysqli tablolarını'.

Bu, herhangi bir tampon kısıtlamaları atlatarak, önceden tanımlanmış bayt parçalar büyük sorguları yüklemek için izin verir.