PHP File Upload


PHP 를 사용해서 파일을 서버에 업로드하는 것이 가능하다.


Create an Upload-File Form

사용자들이 폼으로 파일을 업로드 할수 있도록 하는 것은 매우 유용할 수 있습니다. 

파일을 업로드하기 위한 다음의 HTML 폼을 보시오:

<html>
<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>

위의 HTML form에 대해 다음의 사항들을 주목하시오:

  • <form> 태그의 enctype 속성은 폼을 제출할 때 사용할 콘텐츠-형식(content-type) 을 지정합니다.  "multipart/form-data" 는 업로드할 파일의 내용처럼, 폼이 이진데이터를 요구할 때 사용됩니다.
  • <input> 태그의 type="file" 속성은 입력이 파일로 처리됨을 지정합니다.  예를 들어, 브라우져에서 볼 때, 입력 버튼 다음에 브라우즈-버튼(browse-button)이 온다. 

Note: 사용자가 파일을 업로드 하도록 허용하는 것은 큰 보안 위험이 따른다. 신뢰할 수 있는 사용자에게만 파일 업로드를 허용하십시요.


Create The Upload Script

"upload_file.php" 파일은 파일 업로드를 위한 코드를 포합한다. :

<?php
if (isset($_FILES)) {
    $file = $_FILES["file"];
    // print_r($file);
    $error = $file["error"];
    $name = $file["name"];
    $type = $file["type"];
    $size = $file["size"];
    $tmp_name = $file["tmp_name"];
    if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
    }
    else {
      echo "Upload: " . $name . "<br>";
      echo "Type: " . $type . "<br>";
      echo "Size: " . ($size/1024/1024) . " Mb<br>";
      echo "Stored in: " . $tmp_name;
    }
}
else {
    echo "File is not selected";
}
?>

전역 PHP $_FILES 배열을 사용하여, 클라이언트 컴퓨터로부터 원격 서버에 파일을 업로드 할 수 있습니다. 

첫 번째 파라메터는 폼의 input name 이며, 두 번째 인덱스는 "name", "type", "size", "tmp_name" 또는 "error" 중의 하나가 올 수 있다, 다음 처럼 :

  • $_FILES["file"]["name"] - the name of the uploaded file
  • $_FILES["file"]["type"] - the type of the uploaded file
  • $_FILES["file"]["size"] - the size in bytes of the uploaded file
  • $_FILES["file"]["tmp_name"] - the name of the temporary copy of the file stored on the server
  • $_FILES["file"]["error"] - the error code resulting from the file upload

이것은 파일을 업로드하는 간단한 방법입니다. 보안상의 이유로 어떤 사용자가 업로드할 수 있는지를 제한하는 것을 추가 해야 합니다.


Restrictions on Upload

이 스크립트에서는 파일 업로드에 몇 가지 제한을 추가 합니다. 사용자는 .gif, .jpeg, 과 .png 파일을 업로드 할 수 있습니다. ; 그리고 파일의 크기는 2 Mb 미만이여야 합니다.:

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");

if (isset($_FILES)) {
    $file = $_FILES["file"];
    $error = $file["error"];
    $name = $file["name"];
    $type = $file["type"];
    $size = $file["size"];
    $tmp_name = $file["tmp_name"];
   
    if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
    }
    else {
        $temp = explode(".", $name);
        // print_r($temp);
        $extension = end($temp);
        //echo $extension;
       
        if ( ($size/1024/1024) < 2.) && in_array($extension, $allowedExts) ) {
            echo "Upload: " . $name . "<br>";
            echo "Type: " . $type . "<br>";
            echo "Size: " . ($size/1024/1024) . " Mb<br>";
            echo "Stored in: " . $tmp_name;
        }
        else {
            echo ($size/1024/1024) . " Mbyte is bigger than 2 Mb ";
            echo $extension . "format file is not allowed to upload ! ";
        }
    }
}
else {
    echo "File is not selected";
}
?>


Saving the Uploaded File

위의 예제는 서버의 PHP temp 폴더에 업로드된 파일들의 임시 복사본을 생성합니다.

임시 복사본 파일들은 스크립트가 종료될 때 사라집니다. 업로드된 파일들을 저장하기 위해서는 다른 장소로 복사할 필요가 있습니다. :

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");

if (isset($_FILES)) {
    $file = $_FILES["file"];
    $error = $file["error"];
    $name = $file["name"];
    $type = $file["type"];
    $size = $file["size"];
    $tmp_name = $file["tmp_name"];
   
    if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
    }
    else {
        $temp = explode(".", $name);
        $extension = end($temp);
       
        if ( ($size/1024/1024) < 2. && in_array($extension, $allowedExts) ) {
            //echo "Upload: " . $name . "<br>";
            //echo "Type: " . $type . "<br>";
            //echo "Size: " . ($size / 1024 / 1024) . " Mb<br>";
            //echo "Stored in: " . $tmp_name;
            if (file_exists("upload/" . $name)) {
                echo $name . " already exists. ";
            }
            else {
                move_uploaded_file($tmp_name, "upload/" . $name);
                echo "Stored in: " . "upload/" . $name;
            }
        }
        else {
            echo ($size/1024/1024) . " Mbyte is bigger than 2 Mb ";
            echo $extension . "format file is not allowed to upload ! ";
        }
    }
}
else {
    echo "File is not selected";
}
?>

위의 스크립트는 파일이 이미 존재 하는지 검사하여, 존재하지 않으면, "upload" 라고 하는 폴더에 파일을 복사 합니다.