2009-08-22 2 views
1

PHP를 통해 MySql DB로 파일을 업로드 중입니다. 최대 1MB 크기의 파일을 업로드 할 수 있습니다 (시행 착오를 통해 알 수 있음). 크기가 1MB를 초과하는 파일은 업로드되지 않습니다. PHP에서 mysql_error() 함수로 인쇄 된 MySql 오류는 다음과 같습니다 : MySQL 서버가 사라졌습니다.PHP와 MySql의 업로드 크기 문제

아무도 도와 주실 수 있습니까? MySql 서버는이 오류를 제공하는> 1MB 이상의 요청에 대해서만 실행되고 있습니다.

감사합니다. Mayank.

P.S. .: 양식을 사용하여 파일을 업로드하고 있습니다. <FORM METHOD="post" ACTION="fileUpload.php" ENCTYPE="multipart/form-data"> <INPUT TYPE="hidden" NAME="MAX_FILE_SIZE" VALUE="300000000"> <INPUT TYPE="hidden" NAME="action" VALUE="upload"> Description: <TEXTAREA NAME="txtDescription" ROWS="1" COLS="80"></TEXTAREA> <INPUT TYPE="file" NAME="binFile" ID="binFile"> <INPUT TYPE="submit" NAME="Upload" VALUE="Upload"> </FORM>

답변

4

SQL 문의가 서버의 연결을 끊을 경우 max_allowed_packet 크기를 초과했을 수 있습니다.
max_allowed_packet보다 긴 매개 변수를 청크 단위로 보낼 수있는 mysqli_stmt::send_long_data에 관심이있을 수 있습니다.

업데이트 : "어떻게 변경할 수 있습니까? mysqli를 사용하는 것이 유일한 옵션입니까?"
Afaik 세션 단위로 값을 변경할 수 없습니다. 즉, 서버 구성 (my.cnf 또는 시작 매개 변수)을 변경할 수없는 경우 값은 읽기 전용입니다. 편집 : 만약 당신이 the proper permissions 있다면 그것은 시작된 후 mysql 서버의 글로벌 값을 변경할 수있는 의견을 제안했다. PDO/PDO_MYSQL (phpversion 5.3.0 기준)은 이 아니므로이 send_long_data를 지원하지만 그 중 하나에 대해서는 확실하지 않습니다. 그것은 유일한 옵션으로 mysqli을 남겨 둘 것입니다. 나는 최근에 Wez Furlong이 스택 오버 플로우에 합류 한 것으로 나타났습니다. 그는 그가 알지도 모르는 PDO 구현의 저자이기 때문에 (pdo_ mysql 모듈을 작성하지는 않았지만) 알 수 있습니다. PHP와 서버에 큰 파일을 업로드하기 위해 예를

// $mysqli = new mysqli(.... 
$fp = fopen($_FILES['binFile']['tmp_name'], 'rb') or die('!fopen'); 

//$result = $mysqli->query('SELECT @@max_allowed_packet') or die($mysqli->error); 
//$chunkSize = $result->fetch_all(); 
//$chunkSize = $maxsize[0][0]; 
$chunkSize = 262144; // 256k chunks 

$stmt = $mysqli->prepare('INSERT INTO foo (desc, bindata) VALUES (?,?)') or die($mysqli->error); 
// silently truncate the description to 8k 
$desc = 8192 < strlen($_POST['txtDescription']) ? $_POST['txtDescription'] : substr($_POST['txtDescription'], 0, 8192); 
$stmt->bind_param('sb', $desc, null); 

while(!feof($fp)) { 
    $chunk = fread($fp, $chunkSize); 
    $stmt->send_long_data(1, $chunk) or die('!send_long_data.'.$stmt->error); 
} 
$result = $stmt->execute(); 
+0

안녕 폴커, 의 max_allowed_packet 크기는 기본적으로 1메가바이트가, 난 그게 문제라고 생각합니다. 어떻게 변경할 수 있습니까? mysqli를 사용하는 것이 유일한 옵션입니까? 감사합니다, Mayank. – mkamthan

+0

@mkamthan : 업데이트 – VolkerK

+0

참조 Volker, 을 사용하여 max_allowed_packet을 변경하여 만들었습니다. mysql> SET GLOBAL max_allowed_packet = 16 * 1024 * 1024; // 16MB로 설정 도움 주셔서 감사합니다. 감사합니다, Mayank. – mkamthan

3

(완전히 테스트되지 않은 추한), 당신은 당신의 php.ini 파일에서이 개 매개 변수를 변경해야합니다.

; Maximum allowed size for uploaded files. 
upload_max_filesize = 50M 

; Maximum size of POST data that PHP will accept. 
post_max_size = 50M 

50M = 50Mbps를

+0

"MySQL 서버가 없어졌습니다"라는 메시지는 고려하지 않았습니다. – VolkerK

+0

참. 하지만 이걸 처음부터 시작하겠습니다. –

+0

이것은 또한 $ _FILES [ 'binFile'] [ 'error']에서 UPLOAD_ERR_INI_SIZE 또는 UPLOAD_ERR_PARTIAL로 나타납니다. http://php.net/features.file-upload.errors – VolkerK

1
Try these different settings in C:\wamp\bin\apache\apache2.2.8\bin\php.ini 

Find: 
post_max_size = 8M 
upload_max_filesize = 2M 
max_execution_time = 30 
max_input_time = 60 
memory_limit = 8M 

Change to: 
post_max_size = 750M 
upload_max_filesize = 750M 
max_execution_time = 5000 
max_input_time = 5000 
memory_limit = 1000M 

Then restart wamp to take effect 

Have fun,