Tải lên nhiều tệp trong php


122

Tôi muốn tải lên nhiều tệp và lưu trữ chúng trong một thư mục và lấy đường dẫn và lưu trữ trong cơ sở dữ liệu ... Bất kỳ ví dụ điển hình nào bạn đã tìm kiếm khi thực hiện tải lên nhiều tệp ...

Lưu ý: Tệp có thể thuộc bất kỳ loại nào ...



2
Dưới đây là một ví dụ điển hình để bạn có thể làm theo: VÍ DỤ
Jini

@sarfraz Tôi đã có ngày cuối tuần ... Vừa rồi tôi đã thử ví dụ này thật dễ dàng
udaya

@sarfraz Tôi đã cố gắng tạo <td> <input name = "ufile []" type = "file" id = "ufile []" size = "50" /> </td> từ một nhấp chuột thêm, tôi đã nhận được < td> khi nhấp vào thêm nhưng kết quả không đạt được Bạn có thể xem câu hỏi mới của tôi được đăng không
udaya

Câu trả lời:


260

Tôi biết đây là một bài đăng cũ nhưng một số giải thích thêm có thể hữu ích cho ai đó đang cố gắng tải lên nhiều tệp ... Đây là những gì bạn cần làm:

  • Tên đầu vào phải được định nghĩa là một mảng, tức là name="inputName[]"
  • Phần tử đầu vào phải có multiple="multiple"hoặc chỉmultiple
  • Trong tệp PHP của bạn, hãy sử dụng cú pháp "$_FILES['inputName']['param'][index]"
  • Đảm bảo tìm tên tệp và đường dẫn trống , mảng có thể chứa các chuỗi trống . Sử dụng array_filter()trước khi đếm.

Đây là một ví dụ khó hiểu (chỉ hiển thị mã có liên quan)

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

    }
  }
}

Hy vọng điều này sẽ giúp ích!


1
Tôi không chắc <input type="file">cho phép thuộc tính multiple- kết quả mong đợi sẽ như thế nào? Trình duyệt cho phép nhiều tệp được chọn?
Sven

9
@Sven Vâng, nó được hỗ trợ trong HTML5, hãy xem liên kết này , ngoại hình xấu của tôi có vẻ như IE không hỗ trợ điều này ... Geeze cuộc sống của chúng ta sẽ dễ dàng hơn rất nhiều nếu mọi người chỉ đi theo các tiêu chuẩn ... LOL
Andy Braham

7
@AndyBraham Các multiplethuộc tính của yếu tố đầu vào là boolean, có nghĩa là bạn không cung cấp cho nó một giá trị: <input name="upload[]" type="file" multiple /> Xem spec HTML5: w3.org/TR/2011/WD-html5-20110525/...
Rob Johansen

11
Điều đáng nói là người dùng phải chọn tất cả các tệp cùng một lúc. Bất kỳ nỗ lực lựa chọn nào nữa sẽ hủy bỏ lựa chọn trước đó.
Skippy le Grand Gourou

2
@AlienBishop không hoàn toàn chính xác ở đây, multiple = "multiple" hoàn toàn ổn và được đưa vào thông số kỹ thuật như một giải pháp thay thế.
kojow7

38

Nhiều tệp có thể được chọn và sau đó được tải lên bằng
<input type='file' name='file[]' multiple>
tập lệnh php mẫu thực hiện việc tải lên:

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

Các tệp đã chọn được nhận dưới dạng một mảng với

$_FILES['file']['name'][0]lưu trữ tên của tệp đầu tiên.
$_FILES['file']['name'][1]lưu trữ tên của tệp thứ hai.
và như thế.


Có cách nào để truy cập đường dẫn tệp của từng tệp bằng JS khi tải lên nhiều tệp không? ví dụ: đối với các tệp đơn lẻ, bạn có thể chỉ cần truy vấn tệpInput.value, nhưng tôi nhận thấy rằng khi nhiều tệp được chọn thì tệpInput.value vẫn chỉ xuất ra một đường dẫn ...
oldboy

6

HTML

  1. tạo div với id='dvFile';

  2. tạo ra một button;

  3. onclick của chức năng gọi nút đó add_more()

JavaScript

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 
}

Bằng cách này, bạn có thể thêm tệp / hình ảnh, tùy theo yêu cầu và xử lý chúng thông qua tập lệnh php.


1
Thay thế this document.getElementById ("dvFile"). InnerHTML + = txt; với $ ("#dvFile") .append (txt); nó sẽ lưu tập tin đính kèm của bạn
Rahul rajoria

Câu trả lời này là tối nghĩa (và quá phức tạp đối với một thứ quá đơn giản, theo ý kiến ​​của tôi). Đối với một câu trả lời đúng mất nhìn vào @ rjv là
Vladimir Nul

@VladimirNul có cách nào để truy cập đường dẫn tệp của từng tệp bằng JS khi tải lên nhiều tệp không? ví dụ: đối với các tệp đơn lẻ, bạn có thể chỉ cần truy vấn fileInput.value, nhưng tôi nhận thấy rằng khi nhiều tệp được chọn fileInput.valuevẫn chỉ xuất ra một đường dẫn ...
oldboy

@Anthony có vẻ như bạn đang làm điều đó trong javascript, tôi không hiểu vấn đề. Vui lòng kiểm tra câu trả lời của rjv.
Vladimir Nul

5

Nó không khác gì so với tải lên một tệp - $_FILESlà một mảng chứa bất kỳ và tất cả các tệp đã tải lên.

Có một chương trong hướng dẫn sử dụng PHP: Tải lên nhiều tệp

Nếu bạn muốn cho phép tải lên nhiều tệp với sự lựa chọn dễ dàng từ phía người dùng (chọn nhiều tệp cùng một lúc thay vì điền vào các trường tải lên), hãy xem SWFUpload . Tuy nhiên, nó hoạt động khác với biểu mẫu tải lên tệp thông thường và yêu cầu Flash hoạt động. SWFUpload đã bị loại bỏ cùng với Flash. Kiểm tra các câu trả lời khác, mới hơn để có phương pháp tiếp cận đúng.


1
Câu trả lời này là tối nghĩa. Đối với một câu trả lời đúng mất nhìn vào @ rjv là
Vladimir Nul

Thật. Đã chỉnh sửa để phản ánh điều đó.
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>

Câu trả lời này là tối nghĩa. Đối với một câu trả lời đúng mất nhìn vào @ rjv là
Vladimir Nul

4

Đơn giản là, chỉ cần đếm mảng tệp trước, sau đó trong vòng lặp while bạn có thể dễ dàng thực hiện điều này như

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

bây giờ bạn có tổng số tệp đúng.

Trong vòng lặp while làm như thế này:

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

1
Có điều gì đó thiếu sót ở đây, mời bạn xem câu trả lời của @ rjv.
Vladimir Nul

4

kịch bản đơn giản này đã làm việc cho tôi.

<?php

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

?>

3

Đây là một hàm tôi đã viết trả về một $_FILESmảng dễ hiểu hơn .

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

Tôi chạy vòng lặp foreach với phần tử lỗi, trông giống như

 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

Chúng tôi có thể dễ dàng tải lên nhiều tệp bằng php bằng cách sử dụng tập lệnh bên dưới.

Tải xuống mã nguồn đầy đủ và xem trước

<?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
Vui lòng kiểm tra này URL nó sẽ hữu ích để nâng bạn lên nội dung chất lượng
Willie Cheng

0

Đây là những gì làm việc cho tôi. Tôi phải tải lên tệp, lưu trữ tên tệp và tôi có thêm inof từ các trường đầu vào để lưu trữ và một bản ghi cho mỗi tên tệp. Tôi đã sử dụng serialize () sau đó thêm nó vào truy vấn sql chính.

  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

Liên kết tốt đẹp trên:

Tải lên một tệp PHP với nhiều giải thích cơ bản khác nhau .

Tải lên tệp PHP với Xác thực

Tải lên nhiều tệp PHP với xác thực Nhấp vào đây để tải xuống mã nguồn

PHP / jQuery Tải lên nhiều tệp với thanh tiến trình và xác thực (Nhấp vào đây để tải xuống mã nguồn)

Cách tải lên tệp trong PHP và lưu trữ trong cơ sở dữ liệu MySql (Nhấp vào đây để tải xuống mã nguồn)

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, ");
                }
            }

và bạn phải kiểm tra mã HTML của mình

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

Liên kết tốt đẹp trên:

Tải lên một tệp PHP với nhiều giải thích cơ bản khác nhau .

Tải lên tệp PHP với Xác thực

Tải lên nhiều tệp PHP với xác thực Nhấp vào đây để tải xuống mã nguồn

PHP / jQuery Tải lên nhiều tệp với thanh tiến trình và xác thực (Nhấp vào đây để tải xuống mã nguồn)

Cách tải lên tệp trong PHP và lưu trữ trong cơ sở dữ liệu MySql (Nhấp vào đây để tải xuống mã nguồn)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.