2010-10-24 40 views
7

Có thể tải lên thư mục có trình duyệt không?Cách tải thư mục lên bằng PHP?

Tôi tìm kiếm trong Google và tìm hiểu rằng đây là giới hạn trình duyệt và tôi phải sử dụng Java Applet hoặc Flash.

Có cách nào để tải lên thư mục bằng Flash không? Tôi không thể nhận được bất kỳ đầu mối về điều này. Có cách nào để chỉ có đường dẫn thư mục với trình duyệt không?

Trả lời

3

Xem swfupload - Cách dựa trên Flash để tải lên nhiều tệp cùng một lúc. Dù sao, không thể tải lên một thư mục, bạn chỉ có thể tải lên tất cả các tệp từ thư mục.

1

Có thể tải lên nhiều tệp cùng một lúc bằng cách kéo và thả mà không cần bất kỳ plugin trình duyệt nào. Đây là một phát triển mới với HTML5 và javascript, vì vậy bạn có thể cần một dự phòng cho các trình duyệt cũ hơn.

Nó được gọi là "HTML5 drag and drop". Tôi chưa sử dụng nó, vì vậy tôi không thể cung cấp cho bạn mã mẫu, nhưng tìm kiếm cụm từ đó và đọc bài viết liên quan đến Mozilla Blog có thể cung cấp cho bạn một số gợi ý.

14

Có thể sử dụng webkitdirectory.

<input type="file" webkitdirectory directory multiple /> 

Mặc dù dường như các trình duyệt khác chưa được hỗ trợ.

+1

'webkitdirectory' hoạt động trong Chrome 16 –

+0

' multiple' không hoạt động với 'webkitdirectory' hoặc' directory' –

5

Hãy Thử này để tải lên thư mục:

<form method="post" enctype="multipart/form-data"> 
 
    <input type="file" name="files[]" id="files" multiple="" directory="" webkitdirectory="" mozdirectory=""> 
 
    <input class="button" type="submit" value="Upload" /> 
 
</form>
'

$count = 0; 
if ($_SERVER['REQUEST_METHOD'] == 'POST'){ 
    foreach ($_FILES['files']['name'] as $i => $name) { 
     if (strlen($_FILES['files']['name'][$i]) > 1) { 
      if (move_uploaded_file($_FILES['files']['tmp_name'][$i], 'folder/'.$name)) { 
       $count++; 
      } 
     } 
    } 
} 

'

+0

Làm cách nào để nhận thư mục trên máy chủ? Có vẻ như nó sẽ tải lên tất cả các tệp bên trong thư mục mà không có thông tin về cấu trúc thư mục/thư mục con. Xin đề nghị. –

0

Bạn có thể lưu trữ các thư mục với một cái gì đó giống như tar và sau đó tải nó như một tập tin.Nhưng hãy cẩn thận, bạn có thể vượt quá tối đa tải lên php đó là theo mặc định đặt ở 2MB. Đây là cấu hình mặc dù.

0

để tải lên thư mục trong php, sử dụng các bước sau

<form id="form1" action="myCurrent.php" method="post"> 
<label>Upload All Files From Folder</label> <br/> 
<input id="input" name="input[]" type="file" multiple webkitdirectory > 
<div id="errorBlock" class="help-block"></div> <br/> 

<input type="submit" name="btnDesFolder" id="btnDesFolder" value="send file" /> 
</form> 

<?php 
if(isset($_POST['btnDesFolder'])){ 
    $myFiles = $_POST['input-folder-2']; 

    if(isset($_POST['input-folder-2'])){ 
     $files = scandir("path/to/your/folder"); 
     $oldfolder = "path/to/your/folder/"; 

     $newfolder = "path/to/new/folder"; 

     foreach($files as $fname) { 
      if($fname != '.' && $fname != '..' && $fname != 'index.php') { 
       rename($oldfolder.$fname, $newfolder.$fname); 
      } 
     } 
    } 
} 
?> 
0

Nó dường như không thể tải lên một thư mục bằng cách chỉ sử dụng PHP nhưng Javascript có thể phát hiện các thư mục vì vậy tôi giải quyết nó bằng cách làm hai bước sau:

  1. Tạo chức năng Javascript đọc thư mục và tệp sẽ được tải lên và thêm tệp này vào mảng (tôi gọi là Cấu trúc này) sẽ được gửi cùng với POST. Ví dụ:

    { 
        'foldername/': {'file1.txt','file2.txt}, 
        'foldername/folder2': {'foo.txt', 'bar.png'} 
    } 
    

Có một chức năng tương tự trong Dropzone.js rằng đã xử lý này mà tôi đã phải sửa đổi (_addFilesFromDirectory()). Nhưng bạn có thể tạo ra chức năng của riêng bạn để làm điều này. Hãy xem số https://stackoverflow.com/a/20431117/6760554 nếu bạn cần thêm trợ giúp về vấn đề này.

  1. Trong Php, trước tiên bạn nên để tệp của mình được tải lên một thư mục nhất định nơi chúng sẽ được lưu trữ tạm thời. Sau khi các tệp của bạn đã được tải lên, bạn cần chuyển mảng javascript của mình tới phpcode. Ở đó bạn cần lặp lại mảng và tạo các thư mục rồi di chuyển các tệp đã tải lên từ thư mục tạm thời đến vị trí tương ứng của chúng. Ví dụ:

    $_filetree = $_POST['filetree']; 
    
    function createFoldersAndMoveFiles($_filetree) 
    { 
    
        $nFolders = count($_filetree); 
    
        foreach ($_filetree as $folder => $files) { 
         createFolder($folder); 
         moveFiles($files, $folder); 
    
        } 
    } 
    
    function moveFiles($_files, $_folder) { 
    
        $source = 'tmpuploads/'; 
        $destination = 'mypath/'; 
    
        $nFiles = count($_files); 
        for($i = 0; $i < $nFiles; $i++) { 
         $file = $_files[$i]; 
         rename($source . $file, $destination .$_folder. '/' .$file); 
         } 
    } 
    
    function createFolder($foldername) { 
        $folders = explode("/", $foldername); 
    
        $path = 'mypath/'; 
        $nFolders = count($folders); 
        for($i = 0; $i < $nFolders; $i++){ 
         $newFolder = '/' . $folders[$i]; 
         $path .= $newFolder; 
    
         if (!file_exists($path) && !is_dir($path)) { 
          mkdir($path); 
         } 
    
        } 
    } 
    

Tôi hy vọng điều này sẽ giúp.

Các vấn đề liên quan