> 백엔드 개발 > PHP 튜토리얼 > PHP 파일 업로드 문제 요약

PHP 파일 업로드 문제 요약

伊谢尔伦
풀어 주다: 2023-03-11 16:12:01
원래의
1029명이 탐색했습니다.

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[&#39;userfile&#39;][&#39;name&#39;]
$_FILES[&#39;userfile&#39;][&#39;type&#39;]
$_FILES[&#39;userfile&#39;][&#39;size&#39;]
$_FILES[&#39;userfile&#39;][&#39;tmp_name&#39;]
$_FILES[&#39;userfile&#39;][&#39;error&#39;]
로그인 후 복사

그 중 $_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[&#39;file&#39;][&#39;name&#39;];                                            
       $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 = &#39;./&#39;.date("Y").&#39;/&#39;.date("m").&#39;/&#39;.date("d").&#39;/&#39;;
if (!mkdir($structure, 0777, true)) {
    die(&#39;Failed to create folders...&#39;);
}
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿