2012-08-23 48 views
10

Tôi có URL nơi tôi lưu một số dự án từ tác phẩm của mình, chúng hầu hết là tệp MDB, nhưng một số JPG và PDF cũng có.Tải xuống tệp từ máy chủ php

Điều tôi cần làm là liệt kê mọi tệp từ thư mục đó (đã hoàn tất) và cung cấp cho người dùng tùy chọn tải xuống.

Điều đó đạt được bằng cách sử dụng PHP như thế nào?

+1

Đó không phải là xử lý bởi các trình duyệt? – SomeKittens

+1

nhưng làm cách nào để trình duyệt bắt đầu tải xuống? –

+0

Cung cấp liên kết đến tệp? – Nick

Trả lời

24

Để đọc nội dung thư mục, bạn có thể sử dụng readdir() và sử dụng một kịch bản, trong ví dụ của tôi download.php, để tải file

if ($handle = opendir('/path/to/your/dir/')) { 
    while (false !== ($entry = readdir($handle))) { 
     if ($entry != "." && $entry != "..") { 
      echo "<a href='download.php?file=".$entry."'>".$entry."</a>\n"; 
     } 
    } 
    closedir($handle); 
} 

Trong download.php bạn có thể buộc trình duyệt để gửi dữ liệu tải về, và sử dụng basename() để đảm bảo khách hàng không chuyển tên tệp khác như ../config.php

$file = basename($_GET['file']); 
$file = '/path/to/your/dir/'.$file; 

if(!$file){ // file does not exist 
    die('file not found'); 
} else { 
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-Disposition: attachment; filename=$file"); 
    header("Content-Type: application/zip"); 
    header("Content-Transfer-Encoding: binary"); 

    // read the file from disk 
    readfile($file); 
} 
+0

Tôi nhận được một tin nhắn 403; kiểm tra trên thư mục cho phép và được thiết lập để 777, vì vậy tôi không có đầu mối những gì đang xảy ra. –

+0

đảm bảo đường dẫn là ok ... đường dẫn đến thư mục và tệp –

+0

Kiểm tra nội dung của tệp .htaccess trong thư mục chứa tệp của bạn. –

2

Nếu thư mục có thể truy cập từ trình duyệt (không phải bên ngoài gốc tài liệu của máy chủ web), bạn chỉ cần xuất liên kết đến vị trí của các tệp đó. Nếu chúng ở bên ngoài gốc tài liệu, bạn sẽ cần phải có các liên kết, các nút, bất cứ điều gì, điểm đó đến một tập lệnh PHP để xử lý việc nhận các tệp từ vị trí của chúng và phát trực tiếp đến phản hồi.

+0

Nếu tệp là hình ảnh hoặc văn bản, nó sẽ không tải xuống. –

+0

Nếu đó là một tệp mở trong trình duyệt, bạn có thể sử dụng chức năng lưu của trình duyệt để lưu nó vào hệ thống tệp. Nhiệm vụ vẫn được hoàn thành. –

+0

Nếu bạn có thể nói điều đó với khách hàng, tôi đã biết rằng hầu hết người tiêu dùng không biết phải làm gì nếu họ thấy một tệp văn bản được mở trong trình duyệt hoặc tệp pdf .. –

0

Đây là giải pháp đơn giản để liệt kê tất cả các tệp trong thư mục và tải xuống tệp.

Trong file index.php của bạn

<?php 
$dir = "./"; 

$allFiles = scandir($dir); 
$files = array_diff($allFiles, array('.', '..')); // To remove . and .. 

foreach($files as $file){ 
    echo "<a href='download.php?file=".$file."'>".$file."</a><br>"; 
} 

Chức năng scandir() danh sách tất cả các file và thư mục bên trong đường dẫn cụ thể. Nó hoạt động với cả hai PHP 5 và PHP 7.

Bây giờ trong download.php

<?php 
$filename = basename($_GET['file']); 
// Specify file path. 
$path = ''; // '/uplods/' 
$download_file = $path.$filename; 

if(!empty($filename)){ 
    // Check file is exists on given path. 
    if(file_exists($download_file)) 
    { 
     header('Content-Disposition: attachment; filename=' . $filename); 
     readfile($download_file); 
     exit; 
    } 
    else 
    { 
     echo 'File does not exists on given path'; 
    } 
} 
Các vấn đề liên quan