PHP에서 여러 파일 업로드


122

여러 파일을 업로드하고 폴더에 저장하고 경로를 가져 와서 데이터베이스에 저장하고 싶습니다. 여러 파일 업로드를 위해 찾은 좋은 예 ...

참고 : 파일은 모든 유형이 될 수 있습니다.



2
다음은 따라야 할 좋은 예입니다. EXAMPLE
jini 2010

@sarfraz 난 그냥 지금은 너무 쉽게이 가장 최고 예제를 시도 ... 주말이 있었다
udaya

@sarfraz 추가 클릭에서 <td> <input name = "ufile []"type = "file"id = "ufile []"size = "50"/> </ td>를 생성하려고했습니다. < td> 's on add click but 결과가 나오지 않습니다. 게시 된 새 질문을 볼 수 있습니까
udaya

답변:


260

나는 이것이 오래된 게시물이라는 것을 알고 있지만 몇 가지 추가 설명은 여러 파일을 업로드하려는 사람에게 유용 할 수 있습니다. 다음은 수행해야 할 작업입니다.

  • 입력 이름은 배열로 정의되어야합니다. name="inputName[]"
  • 입력 요소가 있어야 multiple="multiple"하거나multiple
  • PHP 파일에서 구문을 사용하십시오. "$_FILES['inputName']['param'][index]"
  • 빈 파일 이름과 경로 를 찾아야 합니다. 배열에 빈 문자열 이 포함될 수 있습니다 . array_filter()계산하기 전에 사용하십시오 .

다음은 다운되고 더러운 예제입니다 (관련 코드 만 표시).

HTML :

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

PHP :

//$files = array_filter($_FILES['upload']['name']); //something like that to be used before processing files.

// Count # of uploaded files in array
$total = count($_FILES['upload']['name']);

// Loop through each file
for( $i=0 ; $i < $total ; $i++ ) {

  //Get the temp file path
  $tmpFilePath = $_FILES['upload']['tmp_name'][$i];

  //Make sure we have a file path
  if ($tmpFilePath != ""){
    //Setup our new file path
    $newFilePath = "./uploadFiles/" . $_FILES['upload']['name'][$i];

    //Upload the file into the temp dir
    if(move_uploaded_file($tmpFilePath, $newFilePath)) {

      //Handle other code here

    }
  }
}

이것이 도움이되기를 바랍니다!


1
<input type="file">속성을 허용 하는지 잘 모르겠습니다 multiple. 예상되는 결과는 무엇입니까? 여러 파일을 선택할 수있는 브라우저?
Sven

9
@Sven 예, HTML5에서 지원됩니다.이 링크를 확인하세요. IE가이 tho를 지원하지 않는 것 같습니다. 모든 사람이 표준을 따르기 만하면 우리 삶이 훨씬 쉬워 질 것입니다. LOL
Andy Braham

7
@AndyBraham multiple입력 요소 의 속성은 부울이므로 값을 제공하지 않음을 의미합니다 <input name="upload[]" type="file" multiple /> . HTML5 사양 참조 : w3.org/TR/2011/WD-html5-20110525/…
Rob Johansen

11
사용자가 한 번에 모든 파일을 선택해야한다는 점을 언급 할 가치가 있습니다. 추가 선택 시도는 이전 선택을 취소합니다.
Skippy le Grand Gourou 2015.04.06

2
@AlienBishop은 여기에서 정확하지 않습니다. multiple = "multiple"은 완벽하게 괜찮으며 대안으로 사양에 포함되어 있습니다.
kojow7

38

여러 파일을 선택한 다음 업로드를 수행
<input type='file' name='file[]' multiple>
하는 샘플 PHP 스크립트를 사용하여 업로드 할 수 있습니다 .

<html>
<title>Upload</title>
<?php
    session_start();
    $target=$_POST['directory'];
        if($target[strlen($target)-1]!='/')
                $target=$target.'/';
            $count=0;
            foreach ($_FILES['file']['name'] as $filename) 
            {
                $temp=$target;
                $tmp=$_FILES['file']['tmp_name'][$count];
                $count=$count + 1;
                $temp=$temp.basename($filename);
                move_uploaded_file($tmp,$temp);
                $temp='';
                $tmp='';
            }
    header("location:../../views/upload.php");
?>
</html>

선택한 파일은 다음과 같은 배열로 수신됩니다.

$_FILES['file']['name'][0]첫 번째 파일의 이름을 저장합니다.
$_FILES['file']['name'][1]두 번째 파일의 이름을 저장합니다.
등등.


여러 파일을 업로드 할 때 JS로 각 파일의 파일 경로에 액세스하는 방법이 있습니까? 예를 들어, 단일 파일의 경우 단순히 fileInput.value를 쿼리 할 수 ​​있지만 여러 파일을 선택하면 fileInput.value가 여전히 하나의 경로 만 출력한다는 것을 알았습니다 ...
oldboy

6

HTML

  1. 로 div 생성 id='dvFile';

  2. 만들기 button;

  3. onclick 그 버튼 호출 기능의 add_more()

자바 스크립트

function  add_more() {
  var txt = "<br><input type=\"file\" name=\"item_file[]\">";
  document.getElementById("dvFile").innerHTML += txt;
}

PHP

if(count($_FILES["item_file"]['name'])>0)
 { 
//check if any file uploaded
 $GLOBALS['msg'] = ""; //initiate the global message
  for($j=0; $j < count($_FILES["item_file"]['name']); $j++)
 { //loop the uploaded file array
   $filen = $_FILES["item_file"]['name']["$j"]; //file name
   $path = 'uploads/'.$filen; //generate the destination path
   if(move_uploaded_file($_FILES["item_file"]['tmp_name']["$j"],$path)) 
{
   //upload the file
    $GLOBALS['msg'] .= "File# ".($j+1)." ($filen) uploaded successfully<br>";
    //Success message
   }
  }
 }
 else {
  $GLOBALS['msg'] = "No files found to upload"; //No file upload message 
}

이런 식으로 파일 / 이미지를 필요한만큼 추가하고 php 스크립트를 통해 처리 할 수 ​​있습니다.


1
document.getElementById ( "dvFile"). innerHTML + = txt; $ ( "#dvFile")으로 .Append (TXT); 그것은 당신의 첨부 파일에 저장됩니다
라훌 rajoria

이 대답은 단호하지 않습니다 (제 생각에는 너무 간단한 것에는 너무 복잡합니다). 정답을 보려면 @ rjv 's
Vladimir Nul

@VladimirNul 여러 파일을 업로드 할 때 JS로 각 파일의 파일 경로에 액세스하는 방법이 있습니까? 예를 들어, 단일 파일의 경우 간단히 쿼리 할 수 fileInput.value있지만 여러 파일을 선택하면 fileInput.value여전히 하나의 경로 만 출력됩니다.
oldboy

@Anthony 당신이 자바 스크립트에서하는 것처럼 들리지만 요점을 보지 못했습니다. rjv의 답변을 확인하십시오.
Vladimir Nul

5

하나의 파일을 업로드하는 것과 다르지 않습니다. $_FILES . 업로드 된 모든 파일을 포함하는 배열입니다.

PHP 매뉴얼에 다음 장이 있습니다 : 여러 파일 업로드

사용자 측에서 쉽게 선택하여 여러 파일 업로드를 활성화하려면 (업로드 필드를 채우는 대신 한 번에 여러 파일 선택) SWFUpload를 살펴보십시오 . 그러나 일반 파일 업로드 양식과는 다르게 작동하며 작동하려면 Flash가 필요합니다. SWFUpload는 Flash와 함께 사용되지 않습니다. 현재 올바른 접근 방식에 대한 다른 최신 답변을 확인하십시오.


1
이 대답은 단호합니다. 정답을 보려면 @ rjv 's
Vladimir Nul

진실. 그것을 반영하도록 편집되었습니다.
Pekka

4
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?php
$max_no_img=4; // Maximum number of images value to be set here

echo "<form method=post action='' enctype='multipart/form-data'>";
echo "<table border='0' width='400' cellspacing='0' cellpadding='0' align=center>";
for($i=1; $i<=$max_no_img; $i++){
echo "<tr><td>Images $i</td><td>
<input type=file name='images[]' class='bginput'></td></tr>";
}

echo "<tr><td colspan=2 align=center><input type=submit value='Add Image'></td></tr>";
echo "</form> </table>";
while(list($key,$value) = each($_FILES['images']['name']))
{
    //echo $key;
    //echo "<br>";
    //echo $value;
    //echo "<br>";
if(!empty($value)){   // this will check if any blank field is entered
$filename =rand(1,100000).$value;    // filename stores the value

$filename=str_replace(" ","_",$filename);// Add _ inplace of blank space in file name, you can remove this line

$add = "upload/$filename";   // upload directory path is set
//echo $_FILES['images']['type'][$key];     // uncomment this line if you want to display the file type
//echo "<br>";                             // Display a line break
copy($_FILES['images']['tmp_name'][$key], $add); 
echo $add;
    //  upload the file to the server
chmod("$add",0777);                 // set permission to the file.
}
}
?>
</body>
</html>

이 대답은 단호합니다. 정답을 보려면 @ rjv 's
Vladimir Nul

4

간단합니다. 먼저 파일 배열을 계산 한 다음 while 루프에서 다음과 같이 쉽게 수행 할 수 있습니다.

$count = count($_FILES{'item_file']['name']);

이제 총 파일 수가 맞습니다.

while 루프에서 다음과 같이하십시오.

$i = 0;
while($i<$count)
{
    Upload one by one like we do normally
    $i++;
}

1
여기에 빠진 것이 있습니다. @rjv의 답변을 살펴보십시오.
Vladimir Nul

4

이 간단한 스크립트가 저에게 효과적이었습니다.

<?php

foreach($_FILES as $file){
  //echo $file['name']; 
  echo $file['tmp_name'].'</br>'; 
  move_uploaded_file($file['tmp_name'], "./uploads/".$file["name"]);
}

?>

3

다음은 더 이해하기 쉬운 $_FILES배열 을 반환하는 함수 입니다.

function getMultiple_FILES() {
    $_FILE = array();
    foreach($_FILES as $name => $file) {
        foreach($file as $property => $keys) {
            foreach($keys as $key => $value) {
                $_FILE[$name][$key][$property] = $value;
            }
        }
    }
    return $_FILE;
}

2

오류 요소로 foreach 루프를 실행합니다.

 foreach($_FILES['userfile']['error'] as $k=>$v)
 {
    $uploadfile = 'uploads/'. basename($_FILES['userfile']['name'][$k]);
    if (move_uploaded_file($_FILES['userfile']['tmp_name'][$k], $uploadfile)) 
    {
        echo "File : ", $_FILES['userfile']['name'][$k] ," is valid, and was                      successfully uploaded.\n";
    }

    else 
    {
        echo "Possible file : ", $_FILES['userfile']['name'][$k], " upload attack!\n";
    }   

 }


0

아래 스크립트를 사용하면 php를 사용하여 여러 파일을 쉽게 업로드 할 수 있습니다.

전체 소스 코드 다운로드 및 미리보기

<?php
if (isset($_POST['submit'])) {
    $j = 0; //Variable for indexing uploaded image 

 $target_path = "uploads/"; //Declaring Path for uploaded images
    for ($i = 0; $i < count($_FILES['file']['name']); $i++) {//loop to get individual element from the array

        $validextensions = array("jpeg", "jpg", "png");  //Extensions which are allowed
        $ext = explode('.', basename($_FILES['file']['name'][$i]));//explode file name from dot(.) 
        $file_extension = end($ext); //store extensions in the variable

  $target_path = $target_path . md5(uniqid()) . "." . $ext[count($ext) - 1];//set the target path with a new name of image
        $j = $j + 1;//increment the number of uploaded images according to the files in array       

   if (($_FILES["file"]["size"][$i] < 100000) //Approx. 100kb files can be uploaded.
                && in_array($file_extension, $validextensions)) {
            if (move_uploaded_file($_FILES['file']['tmp_name'][$i], $target_path)) {//if file moved to uploads folder
                echo $j. ').<span id="noerror">Image uploaded successfully!.</span><br/><br/>';
            } else {//if file was not moved.
                echo $j. ').<span id="error">please try again!.</span><br/><br/>';
            }
        } else {//if file size and file type was incorrect.
            echo $j. ').<span id="error">***Invalid file Size or Type***</span><br/><br/>';
        }
    }
}
?>

0
$property_images = $_FILES['property_images']['name'];
    if(!empty($property_images))
    {
        for($up=0;$up<count($property_images);$up++)
        {
            move_uploaded_file($_FILES['property_images']['tmp_name'][$up],'../images/property_images/'.$_FILES['property_images']['name'][$up]);
        }
    }

1
이 확인하시기 바랍니다 URL 당신에게 콘텐츠 품질을 위로 들어 올릴 도움이 될 것입니다
윌리 쳉

0

이것이 나를 위해 일한 것입니다. 파일을 업로드하고 파일 이름을 저장해야했고 여러 파일 이름 당 하나의 레코드를 저장할 입력 필드에서 추가 inof가있었습니다. serialize ()를 사용한 다음 기본 SQL 쿼리에 추가했습니다.

  class addReminder extends dbconn {
    public function addNewReminder(){

           $this->exdate = $_POST['exdate'];
           $this->name = $_POST['name'];
           $this->category = $_POST['category'];
           $this->location = $_POST['location'];
           $this->notes = $_POST['notes'];



           try {

                     if(isset($_POST['submit'])){
                       $total = count($_FILES['fileUpload']['tmp_name']);
                       for($i=0;$i<$total;$i++){
                         $fileName = $_FILES['fileUpload']['name'][$i];
                         $ext = pathinfo($fileName, PATHINFO_EXTENSION);
                         $newFileName = md5(uniqid());
                         $fileDest = 'filesUploaded/'.$newFileName.'.'.$ext;
                         $justFileName = $newFileName.'.'.$ext;
                         if($ext === 'pdf' || 'jpeg' || 'JPG'){
                             move_uploaded_file($_FILES['fileUpload']['tmp_name'][$i], $fileDest);
                             $this->fileName = array($justFileName);
                             $this->encodedFileNames = serialize($this->fileName);
                             var_dump($this->encodedFileNames);
                         }else{
                           echo $fileName . ' Could not be uploaded. Pdfs and jpegs only please';
                         }
                       }

                    $sql = "INSERT INTO reminders (exdate, name, category, location, fileUpload, notes) VALUES (:exdate,:name,:category,:location,:fileName,:notes)";
                    $stmt = $this->connect()->prepare($sql);
                    $stmt->bindParam(':exdate', $this->exdate);
                    $stmt->bindParam(':name', $this->name);
                    $stmt->bindParam(':category', $this->category);
                    $stmt->bindParam(':location', $this->location);
                    $stmt->bindParam(':fileName', $this->encodedFileNames);
                    $stmt->bindParam(':notes', $this->notes);
                    $stmt->execute();
                  }

           }catch(PDOException $e){
             echo $e->getMessage();
           }
      }
    }

-1

좋은 링크 :

다양한 기본 설명과 함께 PHP 단일 파일 업로드 .

유효성 검사로 PHP 파일 업로드

유효성 검사와 함께 PHP 다중 파일 업로드 소스 코드를 다운로드하려면 여기를 클릭하십시오.

ProgressBar 및 유효성 검사로 PHP / jQuery 여러 파일 업로드 (소스 코드를 다운로드하려면 여기를 클릭하십시오)

PHP에서 파일을 업로드하고 MySql 데이터베이스에 저장하는 방법 (소스 코드를 다운로드하려면 여기를 클릭하십시오)

extract($_POST);
    $error=array();
    $extension=array("jpeg","jpg","png","gif");
    foreach($_FILES["files"]["tmp_name"] as $key=>$tmp_name)
            {
                $file_name=$_FILES["files"]["name"][$key];
                $file_tmp=$_FILES["files"]["tmp_name"][$key];
                $ext=pathinfo($file_name,PATHINFO_EXTENSION);
                if(in_array($ext,$extension))
                {
                    if(!file_exists("photo_gallery/".$txtGalleryName."/".$file_name))
                    {
                        move_uploaded_file($file_tmp=$_FILES["files"]["tmp_name"][$key],"photo_gallery/".$txtGalleryName."/".$file_name);
                    }
                    else
                    {
                        $filename=basename($file_name,$ext);
                        $newFileName=$filename.time().".".$ext;
                        move_uploaded_file($file_tmp=$_FILES["files"]["tmp_name"][$key],"photo_gallery/".$txtGalleryName."/".$newFileName);
                    }
                }
                else
                {
                    array_push($error,"$file_name, ");
                }
            }

HTML 코드를 확인해야합니다.

<form action="create_photo_gallery.php" method="post" enctype="multipart/form-data">
    <table width="100%">
        <tr>
            <td>Select Photo (one or multiple):</td>
            <td><input type="file" name="files[]" multiple/></td>
        </tr>
        <tr>
            <td colspan="2" align="center">Note: Supported image format: .jpeg, .jpg, .png, .gif</td>
        </tr>
        <tr>
            <td colspan="2" align="center"><input type="submit" value="Create Gallery" id="selectedButton"/></td>
        </tr>
    </table>
</form>

좋은 링크 :

다양한 기본 설명과 함께 PHP 단일 파일 업로드 .

유효성 검사로 PHP 파일 업로드

유효성 검사와 함께 PHP 다중 파일 업로드 소스 코드를 다운로드하려면 여기를 클릭하십시오.

ProgressBar 및 유효성 검사로 PHP / jQuery 여러 파일 업로드 (소스 코드를 다운로드하려면 여기를 클릭하십시오)

PHP에서 파일을 업로드하고 MySql 데이터베이스에 저장하는 방법 (소스 코드를 다운로드하려면 여기를 클릭하십시오)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.