>  기사  >  백엔드 개발  >  PHP는 POST 메서드를 사용하여 단일 파일과 여러 파일을 업로드합니다.

PHP는 POST 메서드를 사용하여 단일 파일과 여러 파일을 업로드합니다.

伊谢尔伦
伊谢尔伦원래의
2016-11-22 10:31:201943검색

이 기능을 사용하면 텍스트 및 바이너리 파일을 업로드할 수 있습니다. PHP의 인증 및 파일 작업 기능을 사용하면 업로드가 허용된 사람과 파일 업로드 후 파일 처리 방법을 완전히 제어할 수 있습니다.

PHP는 RFC-1867 표준을 준수하는 모든 브라우저(Netscape Navigator 3 이상, 패치된 Microsoft Internet Explorer 3 이상 포함)에서 업로드된 파일을 허용할 수 있습니다.

참고: 관련 설정은

php.ini의 file_uploads, upload_max_filesize, upload_tmp_dirpost_max_size 및 max_input_time 설정 옵션을 참조하세요.

예시 #1 파일 업로드 양식

다음과 같이 파일 업로드를 지원하는 특수 양식을 만들 수 있습니다. 위 예의

<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

__URL__을 바꾸고 가리켜야 합니다. 실제 PHP 파일로.

MAX_FILE_SIZE 숨김 필드(단위:바이트)는 파일 입력 필드 앞에 위치해야 하며 해당 값은 수신된 파일의 최대 크기입니다. 이는 브라우저에 대한 권장사항이며, PHP도 이를 확인합니다. 이 설정은 브라우저 측에서 쉽게 무시할 수 있으므로 이 기능을 사용하여 대용량 파일을 차단할 것으로 기대하지 마십시오. 실제로 PHP 설정의 최대 업로드 파일 크기는 만료되지 않습니다. 하지만 이 항목을 양식에 추가하는 것이 더 좋습니다. 사용자가 대용량 파일이 업로드될 때까지 기다리다가 파일이 너무 커서 업로드가 실패한다는 사실을 발견하는 데 시간을 소비하는 문제를 피할 수 있기 때문입니다.

참고:

파일 업로드 양식의 속성이 enctype="multipart/form-data"인지 확인하세요. 그렇지 않으면 파일을 업로드할 수 없습니다.

전역 변수 $_FILES는 PHP 4.1.0부터 존재합니다(이전 버전에서는 $HTTP_POST_FILES로 대체됨). 이 배열에는 업로드된 모든 파일에 대한 정보가 포함되어 있습니다.

위 예시의 $_FILES 배열 내용은 다음과 같습니다. 위의 예와 같이 파일 업로드 필드의 이름이 userfile이라고 가정합니다. 이름은 원하는 대로 지정할 수 있습니다.

$_FILES['userfile']['name']

클라이언트 컴퓨터 파일의 원래 이름입니다.


$_FILES['userfile']['type']

브라우저가 이 정보를 제공하는 경우 파일의 MIME 유형입니다. 예를 들면 "이미지/gif"입니다. 그러나 이 MIME 유형은 PHP 측에서 확인되지 않으므로 이를 당연하게 여기지 마십시오.


$_FILES['userfile']['size']

업로드된 파일의 크기(바이트)입니다.


$_FILES['userfile']['tmp_name']

파일 업로드 후 서버에 저장되는 임시 파일 이름입니다.


$_FILES['userfile']['error']

파일 업로드 관련 오류 코드입니다. 이 프로젝트는 PHP 버전 4.2.0에 추가되었습니다.


파일이 업로드된 후 php.ini의 upload_tmp_dir을 다른 경로로 설정하지 않는 한 기본적으로 서버의 기본 임시 디렉터리에 저장됩니다. 서버 측의 기본 임시 디렉터리는 PHP 실행 환경의 환경 변수 TMPDIR을 변경하여 재설정할 수 있지만, PHP 스크립트 내부에서 putenv() 함수를 실행하여 설정해도 아무런 효과가 없습니다. 이 환경 변수는 업로드된 파일에 대해 다른 작업도 수행되는지 확인하는 데에도 사용할 수 있습니다.

예제 #2 파일 업로드 활성화

자세한 내용은 is_uploaded_file() 및 move_uploaded_file() 함수를 확인하세요. 다음 예에서는 양식에서 제공하는 파일 업로드를 처리합니다.

<?php
// 在PHP4.1.0版本以前, 应该使用$HTTP_POST_FILES来替代$_FILES.
$uploaddir = &#39;/var/www/uploads/&#39;;
$uploadfile = $uploaddir . basename($_FILES[&#39;userfile&#39;][&#39;name&#39;]);
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
if (move_uploaded_file($_FILES[&#39;userfile&#39;][&#39;tmp_name&#39;], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}
echo &#39;Here is some more debugging info:&#39;;
print_r($_FILES);
print "
"; ?>

업로드된 파일을 허용하는 PHP 스크립트는 다음에 해당 파일로 수행할 작업을 결정하기 위해 논리적으로 필요한 검사를 구현해야 합니다. 예를 들어, $_FILES['userfile']['size'] 변수를 사용하여 너무 크거나 작은 파일을 제외할 수 있습니다. 또는 $_FILES['userfile']['type'] 변수를 사용하여 다음을 수행할 수 있습니다. 파일 형식 및 특정 표준을 제외합니다. 일치하지 않는 파일이지만 이 값은 클라이언트에 의해 완전히 제어되고 PHP 측에서 확인되지 않으므로 이를 일련의 확인 중 첫 번째 단계로만 고려합니다. PHP 4.2.0부터 $_FILES['userfile']['error'] 변수를 사용하여 다양한 오류 코드를 기반으로 다음 단계를 계획할 수도 있습니다. 어느 쪽이든 임시 디렉터리에서 파일을 삭제하거나 다른 곳으로 이동하세요.

양식에서 업로드된 파일을 선택하지 않으면 PHP 변수 $_FILES['userfile']['size']의 값은 0이 되고 $_FILES['userfile']['tmp_name']이 됩니다. null이 됩니다.

파일을 이동하거나 이름을 바꾸지 않은 경우 양식 요청이 끝나면 삭제됩니다.

예제 #3 파일 배열 업로드

PHP의 HTML 배열 기능은 파일 형식도 지원합니다.

<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");
    }
}
?>


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.