10/10/2018, 09:31

[PHP] Hàm header() - Em sai chỗ nào đây

Em có cái đoạn code download đơn giản như sau:
PHP Code:
<?php
$link 
"http://ddth.com/baihat.mp3"// Dung lượng 4Mb
//do download
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename="".basename($link)."";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($link));
readfile("$link");
exit();
?>

Đơn giản thế mà nó ko chịu download cho em cơ chứ lị, toàn down về file chính xác tên nhưng dung lượng chỉ có 1-2 Kb
Bác nào có thể cho em thấy cái sai trong đoạn code trên ko ạ?
Bmb viết 11:45 ngày 10/10/2018
Bổ sung code như cái example ở đây thử xem: http://vn2.php.net/readfile
huyhoa viết 11:33 ngày 10/10/2018
Được gửi bởi Bmb
Bổ sung code như cái example ở đây thử xem: http://vn2.php.net/readfile
Không ăn thua bạn ạ. Mình nghĩ có thể phải dùng hàm file_get_content hoặc gì nữa kết hợp để get file trên remote host mà chưa biết cách. Ai biết giúp em với
kiem_bo viết 11:46 ngày 10/10/2018
readfile("$link");
bỏ cái ngoặc kép đi readfile($link);
BossFTP viết 11:43 ngày 10/10/2018
Có thể cái web chứa file đó nó ko cho bác down (403 forbidden).

Thêm cái này vào đầu code
PHP Code:
ini_set('user_agent''BossFTP'); 
huyhoa viết 11:39 ngày 10/10/2018
Được gửi bởi BossFTP
Có thể cái web chứa file đó nó ko cho bác down (403 forbidden).

Thêm cái này vào đầu code
PHP Code:
ini_set('user_agent''BossFTP'); 
Không bác ạ, cái "web đó" là em cũng cho phép nốt rồi bác

Bản chất sự việc như sau:
Em có 1 file download.php đơn giản thế này

PHP Code:
<?php
define
('WEBCUAEM',true);
include(
'includes/config.php');
include(
'includes/functions.php');
$id addslashes($_GET***91;'id'***93;);
if(!
is_numeric($id)) {
$id='';
}
$r $mysql->fetch_array($mysql->query("SELECT tensoft, link FROM ".$tb_prefix."data WHERE soft_id = '".$id."'"));
$link $r***91;'link'***93;;
// Bắt đầu download 
//do download
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=\"".basename($link)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($link));
readfile($link);
exit();
?>
Nhưng lúc download thì nó chả download cái file $link kia ($link khi echo ra thì có dạng http://ddth.com/nghenhac.mp3 - ví dụ vậy)
mà nó lại download cái file download.php đã xuất ra dạng html mới củ chuối chứ. Em cũng chưa biết tại sao nữa
pdah viết 11:38 ngày 10/10/2018
lỗi không nằm ở các hàm header của bạn mà nằm ở hàm readfile()
Nếu bạn gửi tham số vào là một đường dẫn trong system ( /var/www/.... hay 1 đường dẫn tương đối) thì kết quả được như bạn muốn.
Còn nếu bạn đưa đường dẫn là một URL như trong ví dụ của bạn, thì nó sẽ thực hiện 1 request client - web server và trả về mã HTML của cái URL đó
Ngoài ra tôi nghĩ hàm filesize($link) cũng sẽ quăng ra lỗi trong trường hợp này.
huyhoa viết 11:44 ngày 10/10/2018
Được gửi bởi pdah
lỗi không nằm ở các hàm header của bạn mà nằm ở hàm readfile()
Nếu bạn gửi tham số vào là một đường dẫn trong system ( /var/www/.... hay 1 đường dẫn tương đối) thì kết quả được như bạn muốn.
Còn nếu bạn đưa đường dẫn là một URL như trong ví dụ của bạn, thì nó sẽ thực hiện 1 request client - web server và trả về mã HTML của cái URL đó
Ngoài ra tôi nghĩ hàm filesize($link) cũng sẽ quăng ra lỗi trong trường hợp này.
Được gửi bởi huyhoa
Không ăn thua bạn ạ. Mình nghĩ có thể phải dùng hàm file_get_content hoặc gì nữa kết hợp để get file trên remote host mà chưa biết cách. Ai biết giúp em với
Chính xác, em cũng nghĩ là tại hàm readfile() mà chưa biết cách khắc phục
Bác có cách khắc phục không giúp em với

Hàm filesize() có thể bỏ đi mà bác
pdah viết 11:42 ngày 10/10/2018
File mà bạn cho user download xuống được lưu trên server của bạn thôi hay là từ server khác nữa ? Nếu download từ một server khác và đã có sẵn link thì bạn nên cho redirect thay vì đọc nội dung như vậy.

Hơn nữa nếu dùng hàm readfile đơn thuần cho việc download sẽ rất nguy hiểm trong trường hợp nhiều request send đến server hoặc download một file tương đối lớn.
huyhoa viết 11:34 ngày 10/10/2018
Được gửi bởi pdah
File mà bạn cho user download xuống được lưu trên server của bạn thôi hay là từ server khác nữa ? Nếu download từ một server khác và đã có sẵn link thì bạn nên cho redirect thay vì đọc nội dung như vậy.

Hơn nữa nếu dùng hàm readfile đơn thuần cho việc download sẽ rất nguy hiểm trong trường hợp nhiều request send đến server hoặc download một file tương đối lớn.
Là server của em ạ. Script trên 1 host còn link cho download là trên host khác
File lớn nhất dung lượng cũng chỉ tầm vài chục Mb thôi ạ.
Ý bác cho redirect là sao ạ? Nếu redirect thì nó không dấu link. Vì muốn dấu link em mới phải dùng readfile() ạ
Bài liên quan
0