HTTP POSTを使用して、HTMLおよびPHPで複数のファイルを選択してアップロードするにはどうすればよいですか?


155

私はを使用した単一ファイルのアップロードでこれを行った経験があります<input type="file">。しかし、一度に複数のアップロードを行うのに問題があります。

たとえば、一連の画像を選択して、一度にサーバーにアップロードできるようにしたいと考えています。

可能であれば、単一のファイル入力コントロールを使用することをお勧めします。

誰かがこれを達成する方法を知っていますか?ありがとう!


2
ファイルセレクタダイアログで複数のファイルを選択するか、複数のファイル入力を使用することを意味しますか?
MitMaro 2009

こんにちは、アーカイブファイル(zip、rar、tarなど)をアップロードすることはできますか?
sourcerebels

回答:


196

これは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、2012年

11
プロパティを追加しないと機能しませんでした(例:)name="file[]"回答編集しようとしましたが、拒否されました。
ミシェルエアーズ2014年

1
@MichelAyresに感謝します。回答を更新しました。私が最初にこれを書いたとき、私は問題のHTML部分だけに対処しましたb / c PHPの部分を説明する他の答えがありました。やがて、これは人気のある答えになりました。そのため、HTMLとPHPの両方をカバーするように拡張しました。
マークE.ハース2015年

94

複数のファイルのアップロードを作成するために必要なことがいくつかありますが、実際にはかなり基本的なものです。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'の例を使用して、ブラケットの3番目のペアで各ファイルにアクセスできることを意味します。

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

php count()を使用して、選択されたファイルの数をカウントできます。Goodluck widdit!


5
先端をありがとう!時間を大幅に節約+1
BPm

それは非常にうまく動作します...しかし、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アプレットまたは類似のものを使用する必要があります(小さなフラッシュファイルを使用するものがあると思います。見つけたら更新します)。現在、単一のファイル入力では、単一のファイルのみを選択できます。

複数のファイル入力の使用について話している場合は、1つを使用することとそれほど大きな違いはありません。いくつかのコードを投稿してください。


更新:フラッシュを使用する単一の「参照」ボタンを使用する方法が1つあります。私はこれを個人的に使用したことはありませんが、それについてかなりの量を読みました。あなたのベストショットだと思います。

http://swfupload.org/


1
Flashベースのマルチアップローダーへのリンクを追加しました。
MitMaro 2009

私はswfupload fwiwを使用しました-ときどき少し面倒ですが、実際に作業するのはそれほど難しくありません。
Meep3D 2009

@Barsoomは正しいです。過去2年間で、複数のファイルをアップロードすることで状況は大幅に改善されました。:D
MitMaro

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/>';
}
?>

簡単です...仕上げ


1

複数の入力フィールドを使用する場合は、name = "file []"(またはその他の名前)を設定できます。アップロードすると、配列に入れられます($_FILES['file'] = array ({file_array},{file_array]..)


1
<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}.";                               
      }                 

    }               
  }
?>

0

複数の画像をアップロードするために使用されるphp関数を作成しました。この関数は、特定のフォルダーに複数の画像をアップロードできます。また、次のコードでデータベースにレコードを保存できます$ arrayimageは、フォームのメモを通じて送信される画像の配列ですアップロードで複数を使用することはできませんが、ボタンをクリックするとファイルの出力の動的追加フィールドを設定できるので、同じ名前の異なる入力フィールドを作成する必要があります。

$ dirは画像を保存するディレクトリです$ fieldsはデータベースに保存するフィールドの名前です

データベースのフィールドは、データベースイメージストアとフィールド名(id、name、addressなど)がある場合、配列形式である必要があり、次のようなデータをポストする必要があります。

$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 2009

私はあなたに同意します、それが私が「部分的な答え」を書いた理由です。しかし、私はまたコードを再利用するために最善を尽くし、私はしばしば梨でできる限りのことをします(梨のコーダーは私よりはるかに優れています:-D)
damko 09
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.