Hướng dẫn readfile not working php - readfile không hoạt động php

Tôi đang cố gắng để mã này hoạt động nhưng vì một số lý do, tất cả các Echo đều có thể xuất nội dung chính xác, nhưng các tiêu đề dường như không muốn buộc tải xuống tài liệu của tôi. Những gì sau đây là tập tin tôi đang cố gắng xây dựng để tải xuống tệp. Nó được đặt thành mã đầu vào như thế này:

if (ob_get_level()) ob_end_clean();
3 để tải xuống một tệp được đặt tên là
if (ob_get_level()) ob_end_clean();
4 hoặc
if (ob_get_level()) ob_end_clean();
5 từ một trong hai thư mục tùy thuộc vào đặc quyền người dùng.

Tất cả các logic hoạt động đến thông tin tiêu đề ở phía dưới. Nếu tôi nhận xét loại nội dung tiêu đề và xử lý nội dung tiêu đề, thì nó sẽ đọc tệp vào trình duyệt. Bao gồm một trong hai dòng đó, nó cho tôi một lỗi cho biết

if (ob_get_level()) ob_end_clean();
6

 $tlojmemberlength ) { exit("It appears you are trying to jump ahead! While I am excited at your enthusiam, let's not rush our study time."); }

if ( ($lessonnumber > '195') && (!current_user_can("access_s2member_ccap_lastweek")) ) { exit("Upgrade now to access the downloads for the five bonus lessons!"); }

// build Final File Name
$extendedmessage = "";
if ( current_user_can("access_s2member_ccap_extendedlessons")) { $extendedmessage = " - Extended"; }
$myfinishedlessonname = "Lesson " . $lessonnumber . $extendedmessage . " -- The Life of Jesus Study" . "." . $type;

//  echo 'Download Path: ' . $download_path . '
'; // echo 'Source/Lesson Number: ' . $lessonnumber . '
'; // echo 'File Name: ' . $filename . '
'; // echo 'File Type: ' . $type . '
'; // echo 'Allowed Lessons: ' . $tlojmemberlength . '
'; // echo 'Final File Name: ' . $myfinishedlessonname . '
'; // echo 'File Path: ' . $file_path . '
'; // echo 'Content Type: ' . $contenttype . '
'; // echo 'File Size: ' . filesize($file_path) . '
'; if (headers_sent()) { exit("Sorry but the headers have already been sent."); } ob_end_clean(); if (file_exists($file_path)) { header('Content-Description: File Transfer'); header('Content-type: ' . $contenttype); header('Content-disposition: attachment; filename="' . $myfinishedlessonname . '"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: '); header('Pragma: '); header('Content-Length: ' . filesize($file_path)); flush(); ob_clean(); readfile($file_path); exit; } else { exit("No file present."); } ?>

Xin hãy giúp đỡ vì tôi đã ở đây cả ngày và bối rối không có kết thúc tại sao điều này sẽ không hoạt động. FileSize () kéo đúng độ dài để tôi biết có một tệp trong đường dẫn mà tôi đang xem. (Tôi cũng mới sử dụng PHP, vì vậy nếu có một cái gì đó tôi thiếu, xin vui lòng chia sẻ.)

Cảm ơn trước!

Khi sử dụng readfile () - sử dụng php trên apache - là tệp được đọc ngay lập tức vào bộ đệm đầu ra của Apache và thực thi tập lệnh PHP đã hoàn thành hoặc thực thi tập lệnh PHP đợi cho đến khi máy khách hoàn thành tải xuống tệp (hoặc máy chủ hết thời gian hoặc hết thời gian hoặc máy chủ hoặc máy chủ hoặc máy chủ hết Bất cứ điều gì xảy ra đầu tiên)?

Câu chuyện ngược dài hơn:

Tôi có một trang web với rất nhiều tệp MP3 lớn (Bài giảng cho một nhà thờ địa phương). Không phải tất cả các tệp trong kho lưu trữ âm thanh đều được phép tải xuống, do đó, đường dẫn /Sermon/ / Loại nội dung được đặt thành "Âm thanh/MPEG" và tệp được phát trực tuyến bằng readfile (). Tôi đã nhận được khiếu nại (hầu như chỉ từ người dùng iPhone đang phát trực tuyến tải xuống trên 3G) mà các tệp không tải xuống đầy đủ hoặc họ bị cắt sau khoảng 10 hoặc 15 phút. Khi tôi chuyển từ phát trực tuyến tệp bằng readfile () sang chuyển hướng đến tệp - tiêu đề ("vị trí: $ file_url"); - Tất cả các khiếu nại đã biến mất (tôi thậm chí đã kiểm tra với một vài người dùng có thể tái tạo đáng tin cậy vấn đề theo yêu cầu trước đó).

Điều này khiến tôi nghi ngờ rằng khi sử dụng readfile (), công cụ tập lệnh PHP được sử dụng cho đến khi tệp được tải xuống đầy đủ nhưng tôi không thể tìm thấy bất kỳ tài liệu tham khảo nào xác nhận hoặc từ chối lý thuyết này. Tôi sẽ thừa nhận tôi ở nhà nhiều hơn trong thế giới ASP.NET và tương đương DotNet của readfile () đẩy toàn bộ tệp vào bộ đệm đầu ra IIS để đường ống thực thi ASP.NET có thể hoàn thành độc lập với việc phân phối tệp Đối với khách hàng cuối cùng ... có tương đương với hành vi này với PHP+Apache không?

Revent

2.0732 Huy hiệu vàng18 Huy hiệu bạc32 Huy hiệu đồng2 gold badges18 silver badges32 bronze badges

Hỏi ngày 2 tháng 8 năm 2012 lúc 22:25Aug 2, 2012 at 22:25

2

Bạn vẫn có thể có bộ đệm đầu ra PHP hoạt động trong khi thực hiện readfile (). Kiểm tra điều đó với:

if (ob_get_level()) ob_end_clean();

hoặc

while (ob_get_level()) ob_end_clean();

Bằng cách này, bộ đệm đầu ra còn lại phải là bộ đệm đầu ra của Apache, xem SendBuffersize cho các điều chỉnh Apache.

CHỈNH SỬA

Bạn cũng có thể xem MOD_XSENDFILE (một bài đăng SO về việc sử dụng như vậy, PHP + Apache + X-Sendfile), để bạn chỉ cần nói với máy chủ web mà bạn đã thực hiện kiểm tra bảo mật và bây giờ anh ấy có thể cung cấp tệp.

Đã trả lời ngày 3 tháng 8 năm 2012 lúc 11:59Aug 3, 2012 at 11:59

Regileroregileroregilero

Phù bằng vàng 29k658 Huy hiệu bạc98 Huy hiệu đồng6 gold badges58 silver badges98 bronze badges

0

Một vài điều bạn có thể làm (tôi không báo cáo tất cả các tiêu đề mà bạn cần gửi có lẽ là những thứ mà bạn hiện có trong tập lệnh của mình):

set_time_limit(0);  //as already mention
readfile($filename);
exit(0);

hoặc

passthru('/bin/cat '.$filename);
exit(0);

hoặc

//When you enable mod_xsendfile in Apache
header("X-Sendfile: $filename");

hoặc

//mainly to use for remove files
$handle = fopen($filename, "rb");
echo stream_get_contents($handle);
fclose($handle);

hoặc

$handle = fopen($filename, "rb");
while (!feof($handle)){
    //I would suggest to do some checking
    //to see if the user is still downloading or if they closed the connection
    echo fread($handle, 8192);
}
fclose($handle);

Bằng cách này, bộ đệm đầu ra còn lại phải là bộ đệm đầu ra của Apache, xem SendBuffersize cho các điều chỉnh Apache.Oct 19, 2012 at 13:52

CHỈNH SỬAFabrizio

Bạn cũng có thể xem MOD_XSENDFILE (một bài đăng SO về việc sử dụng như vậy, PHP + Apache + X-Sendfile), để bạn chỉ cần nói với máy chủ web mà bạn đã thực hiện kiểm tra bảo mật và bây giờ anh ấy có thể cung cấp tệp.2 gold badges28 silver badges32 bronze badges

1

Đã trả lời ngày 3 tháng 8 năm 2012 lúc 11:59

header("Location: /real/path/to/file");
exit;

Regileroregilero

Phù bằng vàng 29k658 Huy hiệu bạc98 Huy hiệu đồng

set_time_limit(0);

Một vài điều bạn có thể làm (tôi không báo cáo tất cả các tiêu đề mà bạn cần gửi có lẽ là những thứ mà bạn hiện có trong tập lệnh của mình):

Chỉnh sửa: Lý do bạn nhận được khiếu nại này rất nhiều từ người dùng iPhone có lẽ là họ có kết nối chậm hơn (ví dụ: 3G).

Đã trả lời ngày 2 tháng 8 năm 2012 lúc 22:33Aug 2, 2012 at 22:33

LuclucLuc

4.5232 Huy hiệu vàng43 Huy hiệu bạc44 Huy hiệu đồng2 gold badges43 silver badges44 bronze badges

1

Tải xuống các tập tin thông qua PHP không hiệu quả, sử dụng chuyển hướng là cách để đi. Nếu bạn không muốn phơi bày vị trí của tệp hoặc tệp không ở vị trí công khai thì hãy xem xét chuyển hướng nội bộ, đây là một bài đăng nói về nó một chút, tôi có thể nói Apache thực hiện chuyển hướng nội bộ từ PHP không?

Đã trả lời ngày 2 tháng 8 năm 2012 lúc 22:32Aug 2, 2012 at 22:32

HackattackhackAttackhackattack

1.0976 huy hiệu bạc9 Huy hiệu đồng6 silver badges9 bronze badges

4

Thay vào đó hãy thử sử dụng Stream_Copy_To_Stream (). Tôi thấy là có ít vấn đề hơn readfile ().

if (ob_get_level()) ob_end_clean();
0

Đã trả lời ngày 21 tháng 2 năm 2017 lúc 16:29Feb 21, 2017 at 16:29

2

Theo Apache, có một giải pháp elgant đẹp không liên quan đến PHP:

Chỉ cần đặt tệp cấu hình .htaccess vào thư mục chứa các tệp sẽ được cung cấp để tải xuống với các nội dung sau:

if (ob_get_level()) ob_end_clean();
1

Điều này cho Apache cung cấp tất cả các tệp trong thư mục này (và tất cả các thư mục con của nó) để tải xuống, thay vì hiển thị trực tiếp chúng trong trình duyệt.

Đã trả lời ngày 22 tháng 4 năm 2016 lúc 11:53Apr 22, 2016 at 11:53

Xem URL dưới đây

http://php.net/manual/en/function.readfile.php

if (ob_get_level()) ob_end_clean();
2

Đã trả lời ngày 2 tháng 8 năm 2012 lúc 23:15Aug 2, 2012 at 23:15

Abid Hussainabid HussainAbid Hussain

7.6062 Huy hiệu vàng32 Huy hiệu bạc 50 Huy hiệu Đồng2 gold badges32 silver badges50 bronze badges

Không phải là câu trả lời bạn đang tìm kiếm? Duyệt các câu hỏi khác được gắn thẻ PHP Apache hoặc đặt câu hỏi của riêng bạn.