HTTP POST를 사용하여 HTML 및 PHP로 여러 파일을 선택하고 업로드하려면 어떻게해야합니까?


158

.NET을 사용하여 단일 파일 업로드로이 작업을 수행 한 경험이 <input type="file">있습니다. 그러나 한 번에 여러 개를 업로드하는 데 문제가 있습니다.

예를 들어 일련의 이미지를 선택한 다음 한 번에 서버에 업로드 할 수 있기를 원합니다.

가능하면 단일 파일 입력 컨트롤을 사용하는 것이 좋습니다.

누구든지 이것을 수행하는 방법을 알고 있습니까? 감사!


2
파일 선택기 대화 상자에서 하나 이상의 파일을 선택하거나 여러 파일 입력을 사용한다는 의미입니까?
MitMaro

안녕하세요, 아카이브 파일 (zip, rar, tar 등)을 업로드 할 수 있습니까?
sourcerebels

답변:


197

이것은 HTML5 에서 가능합니다 . 예 (PHP 5.4) :

<!doctype html>
<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <form method="post" enctype="multipart/form-data">
            <input type="file" name="my_file[]" multiple>
            <input type="submit" value="Upload">
        </form>
        <?php
            if (isset($_FILES['my_file'])) {
                $myFile = $_FILES['my_file'];
                $fileCount = count($myFile["name"]);

                for ($i = 0; $i < $fileCount; $i++) {
                    ?>
                        <p>File #<?= $i+1 ?>:</p>
                        <p>
                            Name: <?= $myFile["name"][$i] ?><br>
                            Temporary file: <?= $myFile["tmp_name"][$i] ?><br>
                            Type: <?= $myFile["type"][$i] ?><br>
                            Size: <?= $myFile["size"][$i] ?><br>
                            Error: <?= $myFile["error"][$i] ?><br>
                        </p>
                    <?php
                }
            }
        ?>
    </body>
</html>

파일 대화 상자에서 2 개 항목을 선택한 후 Chrome에서 다음과 같이 표시됩니다.

크롬 다중 파일 선택

다음은 "업로드"버튼을 클릭 한 후의 모습입니다.

PHP에 여러 파일 제출

이것은 완전히 작동하는 대답의 스케치입니다. PHP에서 파일 업로드 를 적절하고 안전하게 처리하는 방법에 대한 자세한 내용 은 PHP 매뉴얼 : 파일 업로드 처리를 참조하십시오 .


8
w3c 유효성 검사를 통과 multiple="multiple"합니까 , 아니면 통과해야 합니까?
vol7ron

10
나는 그것이 유효하다고 생각합니다 : thoughtresults.com/html5-boolean-attributes . <! doctype html>을 추가하면 w3c 유효성 검사기를 통과합니다.
Mark E. Haase

2
예, 아마도 HTML의 유효성을 검사하지만 XHTML은 실패합니다. 나는 여전히 XHTML을 사용하는 것을 좋아하지만, 요즘 사람들은 XHTML을 멀리하는 것이 좋습니다.
vol7ron

11
속성 이름 을 추가하지 않으면 작동하지 않았습니다 (예 :) name="file[]". 답변수정 하려고했지만 거부되었습니다.
Michel Ayres 2014 년

1
@MichelAyres에게 감사드립니다. 제 답변을 업데이트했습니다. 처음에 이것을 작성했을 때 문제의 HTML 부분 만 다루었습니다. b / c PHP 부분을 설명하는 다른 답변이있었습니다. 시간이 지남에 따라 이것은 대중적인 답변이되었으므로 이제는 HTML과 PHP를 모두 다루도록 확장했습니다.
Mark E. Haase 2015 년

95

여러 파일 업로드를 만들기 위해해야 ​​할 몇 가지 작업이 있습니다. 실제로는 매우 기본적인 것입니다. Java, Ajax, Flash를 사용할 필요가 없습니다. 다음으로 시작하는 일반 파일 업로드 양식을 작성하십시오.

<form enctype="multipart/form-data" action="post_upload.php" method="POST">

그렇다면 성공의 열쇠입니다.

<input type="file" name="file[]" multiple />

그 괄호를 잊지 마세요! post_upload.php에서 다음을 시도하십시오.

<?php print_r($_FILES['file']['tmp_name']); ?>

tmp_name 데이터가있는 배열을 얻습니다. 즉, 파일 'number'예제에서 세 번째 대괄호 쌍으로 각 파일에 액세스 할 수 있습니다.

$_FILES['file']['tmp_name'][0]

php count ()를 사용하여 선택한 파일 수를 계산할 수 있습니다. Goodluck widdit!


5
팁 고마워! 시간을 많이 절약했습니다. +1
BPm 2012 년

매우 잘 작동하지만 Internet Explorer (v8)에서 이런 방식으로 업로드하는 데 문제가 있습니다. IE는 이런 방식으로 업로드를 지원하지 않는다고 생각합니다.
Tariq M Nasim 2013 년

4
또는 당신과 함께 파일을 반복 할 수있는 foreach문 ... 업로드 된 파일의 수를 몰라도
ygesher

html에서 이름에 키 (예 : name = "file [3]")를 사용하는 경우 $ _FILES [ 'file'] [ 'tmp_name'] [3]을 통해 값에 액세스해야합니다. 그것은 분명하지 않습니다.
MyStream

8

Firefox 5의 전체 솔루션 :

<html>
<head>
</head>
<body>
 <form name="uploader" id="uploader" action="multifile.php" method="POST" enctype="multipart/form-data" >
  <input id="infile" name="infile[]" type="file" onBlur="submit();" multiple="true" ></input> 
 </form>

<?php
echo "No. files uploaded : ".count($_FILES['infile']['name'])."<br>"; 


$uploadDir = "images/";
for ($i = 0; $i < count($_FILES['infile']['name']); $i++) {

 echo "File names : ".$_FILES['infile']['name'][$i]."<br>";
 $ext = substr(strrchr($_FILES['infile']['name'][$i], "."), 1); 

 // generate a random new file name to avoid name conflict
 $fPath = md5(rand() * time()) . ".$ext";

 echo "File paths : ".$_FILES['infile']['tmp_name'][$i]."<br>";
 $result = move_uploaded_file($_FILES['infile']['tmp_name'][$i], $uploadDir . $fPath);

 if (strlen($ext) > 0){
  echo "Uploaded ". $fPath ." succefully. <br>";
 }
}
echo "Upload complete.<br>";
?>

</body>
</html>

코드가 잘 렸습니다. 바로 위에있는 내용은 다음과 같습니다. <html> <head> </head> <body> <form name="uploader" id="uploader" action="multifile.php" method="POST" enctype="multipart/form-data" > <input id="infile" name="infile[]" type="file" onBlur="submit();" multiple="true" ></input> </form>
Thaps

3
그러나 IE8에서는 작동하지 않았지만 실제 브라우저를 사용하십시오.
Thaps

5

찾아보기를 선택할 때 표시되는 파일 선택기 대화 상자에서 여러 파일을 선택하려는 경우 대부분 운이 좋지 않습니다. Java 애플릿 또는 이와 유사한 것을 사용해야합니다 (작은 플래시 파일을 사용하는 것이 있다고 생각합니다. 찾으면 업데이트하겠습니다). 현재 단일 파일 입력은 단일 파일 만 선택할 수 있습니다.

여러 파일 입력을 사용하는 것에 대해 이야기하고 있다면 하나를 사용하는 것과 큰 차이가 없어야합니다. 코드를 게시하면 더 많은 도움을 드리겠습니다.


업데이트 : 플래시를 사용하는 단일 '찾아보기'버튼을 사용하는 한 가지 방법이 있습니다. 나는 이것을 개인적으로 사용한 적이 없지만 그것에 대해 상당한 양을 읽었습니다. 최선의 기회라고 생각합니다.

http://swfupload.org/


1
플래시 기반 다중 업 로더에 대한 링크를 추가했습니다.
MitMaro

저는 swfupload fwiw를 사용했습니다. 가끔씩 약간의 고통이 있지만 작업을 시작하는 것은 그렇게 어렵지 않습니다.
Meep3D

@Barsoom이 정확합니다. 지난 몇 년 동안 여러 파일 업로드에서 상황이 훨씬 나아졌습니다. : D
MitMaro 2012-06-24

4

먼저 다음과 같은 형식을 만들어야합니다.

<form method="post" enctype="multipart/form-data" >
   <input type="file" name="file[]" multiple id="file"/>
   <input type="submit" name="ok"  />
</form> 

맞아 그거야 . 이제이 코드를 양식 코드 아래 또는 원하는 페이지에 추가하십시오.

<?php
if(isset($_POST['ok']))
   foreach ($_FILES['file']['name'] as $filename) {
    echo $filename.'<br/>';
}
?>

간단 해 ... 끝


2
<form action="" method="POST" enctype="multipart/form-data">
  Select image to upload:
  <input type="file"   name="file[]" multiple/>
  <input type="submit" name="submit" value="Upload Image" />
</form>

FOR 루프 사용

<?php    
  $file_dir  = "uploads";    
  if (isset($_POST["submit"])) {

    for ($x = 0; $x < count($_FILES['file']['name']); $x++) {               

      $file_name   = $_FILES['file']['name'][$x];
      $file_tmp    = $_FILES['file']['tmp_name'][$x];

      /* location file save */
      $file_target = $file_dir . DIRECTORY_SEPARATOR . $file_name; /* DIRECTORY_SEPARATOR = / or \ */

      if (move_uploaded_file($file_tmp, $file_target)) {                        
        echo "{$file_name} has been uploaded. <br />";                      
      } else {                      
        echo "Sorry, there was an error uploading {$file_name}.";                               
      }                 

    }               
  }    
?>

FOREACH 루프 사용

<?php
  $file_dir  = "uploads";    
  if (isset($_POST["submit"])) {

    foreach ($_FILES['file']['name'] as $key => $value) {                   

      $file_name   = $_FILES['file']['name'][$key];
      $file_tmp    = $_FILES['file']['tmp_name'][$key];

      /* location file save */
      $file_target = $file_dir . DIRECTORY_SEPARATOR . $file_name; /* DIRECTORY_SEPARATOR = / or \ */

      if (move_uploaded_file($file_tmp, $file_target)) {                        
        echo "{$file_name} has been uploaded. <br />";                      
      } else {                      
        echo "Sorry, there was an error uploading {$file_name}.";                               
      }                 

    }               
  }
?>

1

여러 입력 필드를 사용하는 경우 name = "file []"(또는 다른 이름)을 설정할 수 있습니다. 업로드 할 때 배열에 배치됩니다 ( $_FILES['file'] = array ({file_array},{file_array]..)).


0

여러 이미지를 업로드하는 데 사용되는 PHP 함수를 만들었습니다.이 기능은 특정 폴더에 여러 이미지를 업로드 할 수있을뿐만 아니라 다음 코드에서 데이터베이스에 레코드를 저장할 수 있습니다. $ arrayimage는 양식 메모를 통해 전송되는 이미지의 배열입니다. 업로드는 여러 개를 사용할 수 없지만 버튼 클릭시 파일 unput의 동적 추가 필드를 설정할 수있는 것과 동일한 이름으로 다른 입력 필드를 만들어야합니다.

$ dir은 이미지를 저장할 디렉토리입니다. $ fields는 데이터베이스에 저장할 필드의 이름입니다.

데이터베이스 이미지 저장소와 ID, 이름, 주소와 같은 필드 이름이있는 경우 데이터베이스 필드는 배열 형식이어야합니다. 그러면 다음과 같은 데이터를 게시해야합니다.

$fields=array("id"=$_POST['idfieldname'], "name"=$_POST['namefield'],"address"=$_POST['addressfield']);

그런 다음 해당 필드를 $ fields 함수에 전달합니다.

$ table은 데이터를 저장할 테이블의 이름입니다 ..

function multipleImageUpload($arrayimage,$dir,$fields,$table)
{
    //extracting extension of uploaded file
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    $temp = explode(".", $arrayimage["name"]);
    $extension = end($temp);

    //validating image
    if ((($arrayimage["type"] == "image/gif")
    || ($arrayimage["type"] == "image/jpeg")
    || ($arrayimage["type"] == "image/jpg")
    || ($arrayimage["type"] == "image/pjpeg")
    || ($arrayimage["type"] == "image/x-png")
    || ($arrayimage["type"] == "image/png"))

    //check image size

    && ($arrayimage["size"] < 20000000)

    //check iamge extension in above created extension array
    && in_array($extension, $allowedExts)) 
    {
        if ($arrayimage["error"] > 0) 
        {
            echo "Error: " . $arrayimage["error"] . "<br>";
        } 
        else 
        {
            echo "Upload: " . $arrayimage["name"] . "<br>";
            echo "Type: " . $arrayimage["type"] . "<br>";
            echo "Size: " . ($arrayimage["size"] / 1024) . " kB<br>";
            echo "Stored in: ".$arrayimage['tmp_name']."<br>";

            //check if file is exist in folder of not
            if (file_exists($dir."/".$arrayimage["name"])) 
            {
                echo $arrayimage['name'] . " already exists. ";
            } 
            else 
            {
                //extracting database fields and value
                foreach($fields as $key=>$val)
                {
                    $f[]=$key;
                    $v[]=$val;
                    $fi=implode(",",$f);
                    $value=implode("','",$v);
                }
                //dynamic sql for inserting data into any table
                $sql="INSERT INTO " . $table ."(".$fi.") VALUES ('".$value."')";
                //echo $sql;
                $imginsquery=mysql_query($sql);
                move_uploaded_file($arrayimage["tmp_name"],$dir."/".$arrayimage['name']);
                echo "<br> Stored in: " .$dir ."/ Folder <br>";

            }
        }
    } 
    //if file not match with extension
    else 
    {
        echo "Invalid file";
    }
}
//function imageUpload ends here
}

// imageFunctions 클래스는 여기서 끝납니다.

이 코드는 확장자를 가진 여러 이미지를 삽입하기 위해 시도 할 수 있습니다.이 기능은 이미지 파일을 확인하기 위해 생성됩니다. 코드에서 수직 파일에 대한 확장자 목록을 대체 할 수 있습니다.


안녕하세요. 파일 입력을 사용하여 자동 생성 된 이메일에 문서를 첨부합니다. 한 번에 여러 문서를 첨부 할 수 있지만 다른 디렉토리에서 여러 문서를 첨부하고 싶습니다. 현재이 작업을 수행하면 현재 선택한 문서가 선택한 새 문서로 대체됩니다. 어떻게해야하나요? 감사합니다
Kunbi

-1

부분 답변 : pear HTTP_UPLOAD는 http://pear.php.net/manual/en/package.http.http-upload.examples.php 유용 할 수 있습니다 .

여러 파일에 대한 전체 예제가 있습니다.


1
PEAR 패키지를 사용할 수 있지만이 작업은 매우 사소하며 패키지가 제공하는 추가 기능 (국제화 된 오류 메시지, 유효성 검사 등)이 필요하지 않는 한 기본 PHP 기능을 사용하는 것이 좋습니다. 그러나 이것은 단지 내 의견입니다. :)
MitMaro

동의합니다. 그래서 "부분 답변"을 썼습니다. 하지만 코드를 재사용하기 위해 최선을 다하고 배와 함께 할 수있는 한 자주 작업합니다 (배 코더가 나보다 훨씬 낫습니다 :-D)
damko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.