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:
Đơ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 ạ?
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 ạ?
Bài liên quan
bỏ cái ngoặc kép đi readfile($link);
Thêm cái này vào đầu code
ini_set('user_agent', 'BossFTP');
Bản chất sự việc như sau:
Em có 1 file download.php đơn giản thế này
<?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();
?>
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
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.
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
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.
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() ạ