PHP에서 파일을 업로드할 때 자주 발생하는 몇 가지 문제를 나중에 사용할 때 찾아볼 필요가 없도록 정리해 보겠습니다.
1. 먼저 가장 간단한 업로드 파일을 만듭니다
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <form action="upload_file.php" method="post" enctype="multipart/form-data"> <label for="file">Filename:</label> <input type="file" name="file" id="file" /> <br /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html>
<?php if (($_FILES["file"]["size"] < 20000) { if ($_FILES["file"]["error"] > 0) { echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; if ( file_exists ("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; } } } else { echo "Invalid file"; } ?>
2. 그런 다음 슈퍼 전역 변수 $_FILES
$_FILES['userfile']['name'] $_FILES['userfile']['type'] $_FILES['userfile']['size'] $_FILES['userfile']['tmp_name'] $_FILES['userfile']['error']
그 중 $_FILES['userfile']['error'의 모든 값을 이해합니다. ] 값:
UPLOAD_ERR_OK 값이 0이고 오류가 발생하지 않으며 파일 업로드가 성공합니다.
UPLOAD_ERR_INI_SIZE 값은 1이며, 업로드된 파일이 php.ini의 upload_max_filesize 옵션에 의해 제한되는 값을 초과합니다.
UPLOAD_ERR_FORM_SIZE 값은 2이며, 업로드된 파일의 크기가 HTML 양식의 MAX_FILE_SIZE 옵션에 지정된 값을 초과합니다.
UPLOAD_ERR_PARTIAL 값은 3이며 파일이 부분적으로만 업로드됩니다.
UPLOAD_ERR_NO_FILE 값은 4이며 업로드된 파일이 없습니다.
UPLOAD_ERR_NO_TMP_DIR 값이 6이면 임시 폴더를 찾을 수 없습니다. PHP 4.3.10 및 PHP 5.0.3에서 도입되었습니다.
UPLOAD_ERR_CANT_WRITE 값은 7이며 파일 쓰기에 실패했습니다. PHP 5.1.0에서 도입되었습니다.
3. 많은 상황: 업로드된 파일 형식을 엄격하게 판단해야 합니다
업로드된 파일 형식을 판단하기 위해 $_FILES['userfile']['type']을 사용하는 것은 매우 현명하지 못한 접근 방식이라는 것을 알고 있습니다. , 파일을 기준으로 판단하기 때문에 누구나 mp3 파일의 접미사를 jpg로 변경하고 그림으로 위장하여 업로드할 수 있습니다. 따라서 PHP는 공식적으로 PHP 확장자 php_fileinfo를 사용하여 파일의 MIME을 확인할 것을 권장합니다. Baidu에서 확장 기능을 활성화하는 방법에는 여러 가지가 있습니다. Win과 Linux는 약간 다릅니다.
4. 시나리오 1: 동일한 이름의 파일을 업로드한 후 자동으로 이름 바꾸기
if (file_exists("./upload/" . $_FILES["file"]["name"])) { do{ $suffix =""; $suffix_length = 4; $str = "0123456789abcdefghijklmnopqrstuvwxyz"; $len = strlen($str)-1; //文件名后追加4个随机字符 for($i=0 ; $i<$suffix_length; $i++){ $suffix .= $str[rand(0,$len)]; } $upload_filename = $_FILES['file']['name']; $filename = substr($upload_filename,0,strrpos($upload_filename,".")).$suffix.".".substr($upload_filename,strrpos($_FILES["file"]["name"],".")+1); }while(file_exists("./upload/".$filename)); move_uploaded_file($_FILES["file"]["tmp_name"],"./upload/" . $filename); }else{ move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); }
5. 시나리오 2: 날짜를 기준으로 디렉터리에 파일 업로드
$structure = './'.date("Y").'/'.date("m").'/'.date("d").'/'; if (!mkdir($structure, 0777, true)) { die('Failed to create folders...'); } move_uploaded_file($_FILES["file"]["tmp_name"],$structure . $_FILES["file"]["name"]);
6: 여러 파일 업로드
<form action="" method="post" enctype="multipart/form-data"> <p>Pictures: <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="submit" value="Send" /> </p> </form>
<?php foreach ($_FILES["pictures"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["pictures"]["tmp_name"][$key]; $name = $_FILES["pictures"]["name"][$key]; move_uploaded_file($tmp_name, "data/$name"); } } ?>
예 여러 파일의 경우 이 변수 구조는 사용하기 쉽지 않습니다.
array(1) { ["upload"]=>array(2) { ["name"]=>array(2) { [0]=>string(9)"file0.txt" [1]=>string(9)"file1.txt" } ["type"]=>array(2) { [0]=>string(10)"text/plain" [1]=>string(10)"text/html" } } }
많은 경우에 필요한 것은 이와 유사한 구조입니다.
array(1) { ["upload"]=>array(2) { [0]=>array(2) { ["name"]=>string(9)"file0.txt" ["type"]=>string(10)"text/plain" }, [1]=>array(2) { ["name"]=>string(9)"file1.txt" ["type"]=>string(10)"text/html" } } }
다음 함수를 사용하면 구조를 쉽게 변환할 수 있습니다
function perse_array($vector) { $result = array(); foreach($vector as $key1 => $value1) foreach($value1 as $key2 => $value2) $result[$key2][$key1] = $value2; return $result; } $upload = perse_array($_FILES["upload"]);
7. 때때로: 요구서버 구성최대 업로드 파일 크기 수정
먼저 양식에서
업로드 파일 크기를 제한할 수 있습니다(우회 가능).
그런 다음 서버의 구성도 조정해야 합니다
php.ini:
max_execution_time = 30 각 스크립트가 실행되는 최대 시간(초)
max_input_time = 60, 각 스크립트가 사용할 수 있는 시간, 단위 초
memory_limit = 128M, 이는 스크립트에서 소비하는 최대 메모리입니다.
post_max_size = 8M, 양식으로 제출되는 최대 데이터는 8M입니다. 이 항목은 업로드되는 단일 파일의 크기를 제한하지 않지만 제출되는 데이터를 제한합니다. 전체 형태의.
upload_max_filesize = 2M, 업로드 가능한 최대 파일 크기
nginx:
location / { root html; index index.html index.htm; client_max_body_size 1000m; }
위 내용은 PHP 파일 업로드 문제 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!