2010-01-08 29 views
14

Tôi muốn phân phát tệp hiện có tới trình duyệt bằng PHP. Tôi đã xem các ví dụ về hình ảnh/jpeg nhưng chức năng đó dường như lưu tệp vào đĩa và bạn phải tạo một đối tượng hình ảnh có kích thước phù hợp trước (hoặc tôi không hiểu nó :))Tệp đầu ra PHP trên đĩa tới trình duyệt

In asp. net Tôi làm điều đó bằng cách đọc các tập tin trong một mảng byte và sau đó gọi context.Response.BinaryWrite (bytearray), vì vậy tôi đang tìm một cái gì đó tương tự trong PHP.

Michel

Trả lời

26

fpassthru() rằng nên thực hiện chính xác những gì bạn cần. Xem mục nhập thủ công để đọc về ví dụ sau:

<?php 

// open the file in a binary mode 
$name = './img/ok.png'; 
$fp = fopen($name, 'rb'); 

// send the right headers 
header("Content-Type: image/png"); 
header("Content-Length: " . filesize($name)); 

// dump the picture and stop the script 
fpassthru($fp); 
exit; 

?> 

Xem here cho tất cả các chức năng hệ thống tệp của PHP.

Nếu đó là tệp nhị phân bạn muốn cung cấp để tải xuống, có thể bạn cũng muốn gửi tiêu đề phù hợp để hộp thoại "Lưu dưới dạng .." bật lên. Xem câu trả lời đầu tiên cho this question để có ví dụ tốt về tiêu đề cần gửi.

+1

Nếu tôi đã lưu trữ nội dung nhị phân dưới dạng biến. Làm thế nào để xuất nó ra trình duyệt dưới dạng tệp có thể tải xuống? – CMCDragonkai

2

Điều này sẽ giúp bạn bắt đầu: http://de.php.net/manual/en/function.readfile.php

Edit: Nếu máy chủ web của bạn hỗ trợ nó, sử dụng

header('X-Sendfile: ' . $filename); 

nơi tên tập tin chứa một con đường địa phương như

/var/www/www.example.org/downloads/example.zip 

nhanh hơn readfile().

(cân nhắc an ninh thông thường cho việc sử dụng tiêu đề() áp dụng)

+0

+1 cho 'X-Sendfile'. – Christian

1

Đối với cả trang web và trang web tôi tạo cho khách hàng, tôi sử dụng tập lệnh PHP mà tôi đã tìm thấy từ lâu.

Nó có thể được tìm thấy ở đây: http://www.zubrag.com/scripts/download.php

tôi sử dụng một phiên bản sửa đổi nhẹ của nó cho phép tôi để xáo trộn cấu trúc hệ thống tập tin (mà nó theo mặc định) ngoài việc không cho phép liên kết nóng (mặc định) và Tôi đã thêm một số tính năng theo dõi bổ sung, chẳng hạn như liên kết giới thiệu, IP (mặc định) và các dữ liệu khác mà tôi có thể cần nếu có thứ gì đó xuất hiện.

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn kịch bản. Nếu tôi muốn mở rộng kịch bản đầu tiên của tôi, tôi chắc chắn sẽ sử dụng nó. – Michel

2

tôi sử dụng readfile() (http://www.php.net/readfile) ...

Nhưng bạn phải chắc chắn rằng bạn thiết lập quyền "Content-Type" với tiêu đề() để trình duyệt biết phải làm gì với tập tin.

Bạn cũng có thể buộc trình duyệt tải tệp xuống thay vì cố gắng sử dụng plugin để hiển thị tệp (như đối với tệp PDF), tôi luôn thấy điều này có vẻ hơi "hack", nhưng được giải thích tại ở trên liên kết.

9

tôi sử dụng này

if (file_exists($file)) { 


     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename='.basename($file)); 
     header('Content-Transfer-Encoding: binary'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($file)); 

     ob_clean(); 
     flush(); 
     readfile($file); 
     exit; 

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