2009-07-24 49 views
121

Tôi có kinh nghiệm thực hiện việc này với các tệp tải lên một lần bằng cách sử dụng <input type="file">. Tuy nhiên, tôi gặp sự cố khi tải lên nhiều lần một lần.Làm cách nào để chọn và tải lên nhiều tệp bằng HTML và PHP, sử dụng HTTP POST?

Ví dụ: tôi muốn có thể chọn một loạt hình ảnh, sau đó tải chúng lên máy chủ, tất cả cùng một lúc.

Thật tuyệt vời khi sử dụng một điều khiển nhập tệp đơn lẻ, nếu có thể.

Có ai biết cách thực hiện điều này không? Cảm ơn!

+2

Bạn có nghĩa là chọn nhiều sau đó một tập tin trong hộp thoại chọn tập tin hoặc sử dụng nhiều đầu vào tập tin? – MitMaro

+0

Xin chào, Bạn có thể tải lên tệp lưu trữ (zip, rar, tar, ...)? – sourcerebels

Trả lời

158

Điều này có thể trong HTML5. Ví dụ (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> 

Đây là những gì nó trông giống như trong Chrome sau khi chọn 2 mục trong hộp thoại file:

chrome multiple file select

Và đây là những gì nó trông giống như sau khi nhấp vào "Tải lên" nút.

submitting multiple files to PHP

Đây chỉ là một phác thảo của một câu trả lời hoàn toàn làm việc. Xem PHP Manual: Handling file uploads để biết thêm thông tin về cách xử lý tệp tải lên đúng cách, an toàn trong PHP.

+7

có vượt qua được quá trình xác thực w3c hay nó là 'multiple =" multiple "'? – vol7ron

+9

Tôi cho rằng nó hợp lệ: http://thoughtresults.com/html5-boolean-attributes. Nó vượt qua trình xác nhận hợp lệ w3c nếu bạn thêm . –

+1

vâng, nó có thể xác thực HTML, nhưng không thành công XHTML. Mặc dù tôi vẫn muốn sử dụng XHTML, tôi nghĩ mọi người khuyên nên tránh xa nó trong những ngày này. – vol7ron

-1

một phần câu trả lời: lê HTTP_UPLOAD có thể có ích http://pear.php.net/manual/en/package.http.http-upload.examples.php

có một ví dụ đầy đủ cho nhiều file

+1

Bạn có thể sử dụng gói PEAR nhưng nhiệm vụ này khá tầm thường và trừ khi bạn cần các tính năng bổ sung mà gói cung cấp (thông báo lỗi quốc tế, xác thực, v.v.) tôi khuyên bạn nên sử dụng các hàm PHP gốc. Nhưng đây chỉ là ý kiến ​​của tôi. :) – MitMaro

+0

Tôi đồng ý với bạn, đó là lý do tại sao tôi đã viết "câu trả lời một phần". Nhưng tôi cũng cố gắng hết sức để tái sử dụng mã và tôi thường làm việc nhiều nhất có thể với lê (các trình lập trình lê tốt hơn nhiều so với tôi :-D) – damko

4

Nếu bạn muốn chọn nhiều file từ hộp thoại chọn tập tin đó sẽ hiển thị khi bạn chọn trình duyệt sau đó bạn hầu như không may mắn. Bạn sẽ cần phải sử dụng một applet Java hoặc một cái gì đó tương tự (tôi nghĩ rằng có một trong đó sử dụng một tập tin flash nhỏ, tôi sẽ cập nhật nếu tôi tìm thấy nó). Hiện tại, một đầu vào tệp đơn chỉ cho phép chọn một tệp.

Nếu bạn đang nói về việc sử dụng nhiều đầu vào tệp thì sẽ không có nhiều khác biệt khi sử dụng một tệp. Đăng một số mã và tôi sẽ cố gắng giúp đỡ thêm.


Cập nhật: Có một phương pháp để sử dụng nút 'duyệt' duy nhất sử dụng flash. Tôi chưa bao giờ cá nhân sử dụng điều này nhưng tôi đã đọc một số tiền hợp lý về nó. Tôi nghĩ rằng bức ảnh đẹp nhất của bạn.

http://swfupload.org/

+1

Tôi đã thêm liên kết vào trình tải lên nhiều flash dựa trên. – MitMaro

+0

Tôi đã sử dụng swfupload fwiw - đó là một chút đau trong những dịp nhưng nó không thực sự khó để làm việc. – Meep3D

+1

có thể nao ... – Michelle

1

Nếu bạn sử dụng nhiều lĩnh vực đầu vào bạn có thể đặt name = "nộp []" (hoặc bất kỳ tên khác). Điều đó sẽ đưa chúng vào một mảng khi bạn tải chúng lên ($_FILES['file'] = array ({file_array},{file_array]..))

6

giải pháp đầy đủ trong 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> 
+0

Mã bị cắt bớt. Đây là những gì diễn ra chỉ ở trên nó: '

' – Thaps

+3

Nó không hoạt động trong IE8, nhưng sau đó chỉ cần sử dụng trình duyệt thực. – Thaps

88

Có một vài điều bạn cần phải làm gì để tạo ra một tập tin tải lên nhiều, nó khá cơ bản thực sự. Bạn không cần phải sử dụng Java, Ajax, Flash. Chỉ cần tạo biểu mẫu tải lên tệp bình thường bắt đầu với:

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

Sau đó, chìa khóa để thành công;

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

KHÔNG quên các dấu ngoặc đó! Trong post_upload.php hãy thử như sau:

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

Thông báo bạn nhận được một mảng với tmp_name dữ liệu, trong đó sẽ có nghĩa là bạn có thể truy cập vào từng tập tin với một cặp thứ ba của dấu ngoặc với các tập tin 'số' dụ:

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

Bạn có thể sử dụng số lượng php() để đếm số lượng tệp đã được chọn. Goodluck widdit!

+5

Cảm ơn mẹo! nó tiết kiệm cho tôi rất nhiều thời gian +1 – BPm

+0

Nó hoạt động rất tốt ... nhưng tôi gặp sự cố khi tải lên theo cách này trong Internet Explorer (v8). Tôi nghĩ IE không hỗ trợ tải lên theo cách này. –

+0

THANKS..hoạt động giống như ma thuật – Charmie

3

theo hình thức đầu tiên bạn nên làm như thế này:

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

đó là đúng. bây giờ thêm mã này dưới mẫu mã của bạn hoặc trên bất kỳ trang nào bạn thích

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

thật dễ dàng ... kết thúc

0

tôi đã tạo ra một hàm php được sử dụng để tải lên nhiều hình ảnh, chức năng này có thể tải lên nhiều hình ảnh trong thư mục cụ thể cũng có thể lưu các bản ghi vào cơ sở dữ liệu trong mã sau đây $ arrayimage là mảng hình ảnh được gửi qua biểu mẫu lưu ý rằng nó sẽ không cho phép tải lên sử dụng nhiều nhưng bạn cần tạo lĩnh vực đầu vào khác nhau với cùng tên như bạn sẽ có thể thiết lập năng động, thêm lĩnh vực của tập tin unput trên nút cli ck.

$ dir là thư mục mà bạn muốn lưu hình ảnh $ ruộng là tên của field mà bạn muốn để lưu trữ trong cơ sở dữ liệu

lĩnh vực cơ sở dữ liệu phải nằm trong mảng formate dụ nếu bạn có cơ sở dữ liệu imagestore và các lĩnh vực tên như id, tên, địa chỉ thì bạn cần phải gửi dữ liệu như

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

và sau đó vượt qua lĩnh vực đó vào chức năng $ lĩnh vực

$ table là tên của bảng mà bạn muốn lưu trữ dữ liệu.

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 lớp kết thúc tại đây

bạn có thể thử mã này để chèn nhiều hình ảnh với phần mở rộng của nó chức năng này được tạo ra để kiểm tra tập tin hình ảnh, bạn có thể thay thế các danh sách phần mở rộng cho các tập tin perticular trong mã

+0

Xin chào tất cả, tôi sử dụng đầu vào tệp để đính kèm tài liệu vào email được tạo tự động. Tôi có thể đính kèm nhiều tài liệu khi đang di chuyển, tuy nhiên, tôi muốn đính kèm nhiều tài liệu từ thư mục khác nhau. Hiện tại nếu tôi làm điều này, tài liệu được chọn hiện tại của tôi sẽ được thay thế bằng tài liệu mới mà tôi chọn. Làm thế nào để tôi đi về điều này. Cảm ơn – Kunbi

0

tôi có chút này đơn giản hơn một

<?php 

    $image1=$_FILES["file"] ["name"][0]; 
    $image2=$_FILES["file"] ["name"][1]; 
    $image3=$_FILES["file"] ["name"][2]; 

    $temp1=$_FILES["file"] ["tmp_name"][0]; 
    $temp2=$_FILES["file"] ["tmp_name"][1]; 
    $temp3=$_FILES["file"] ["tmp_name"][2]; 

    $image4=$_FILES["file_ot"] ["name"][0]; 
    $image5=$_FILES["file_ot"] ["name"][1]; 


    $temp4=$_FILES["file_ot"] ["tmp_name"][0]; 
    $temp5=$_FILES["file_ot"] ["tmp_name"][1]; 




    $query="INSERT INTO `vendordata`(`details`, `phone`, `email`, `driverpic`, `licensepic`, `adharcardpic`, `pancard`, `policeverification`) 
    VALUES ('$details','$phone','$email','$image1','$image2','$image3','$image4','$image5')"; 



    move_uploaded_file($temp1,'uploads/'.$image1); 
    move_uploaded_file($temp2,'uploads/'.$image2); 
    move_uploaded_file($temp3,'uploads/'.$image3); 
    move_uploaded_file($temp4,'uploads/'.$image4); 
    move_uploaded_file($temp5,'uploads/'.$image5); 
    $run=$db->query($query); 
    if ($run) { 
     echo "inserted"; 
    } 
    else { 
     echo("Error description: " . mysqli_error($db)); 
    } 
    ?> 
0
<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> 

Sử dụng vòng lặp 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}.";        
     }     

    }    
    }  
?> 

Sử dụng foreach Vòng

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

    }    
    } 
?> 
Các vấn đề liên quan