Sử dụng PHP, tôi đang cố gắng phân phối các tệp lớn (tối đa 200MB) không nằm trong thư mục có thể truy cập web do các vấn đề về ủy quyền. Hiện tại, tôi sử dụng cuộc gọi readfile()
cùng với một số tiêu đề để phân phối tệp, nhưng có vẻ như PHP đang tải nó vào bộ nhớ trước khi gửi. Tôi dự định triển khai trên một máy chủ lưu trữ được chia sẻ, điều này sẽ không cho phép tôi sử dụng nhiều bộ nhớ hoặc thêm các mô-đun Apache của riêng tôi như X-Sendfile.Cách tải xuống các tệp lớn thông qua tập lệnh PHP
Tôi không thể để các tệp của mình nằm trong thư mục có thể truy cập web vì lý do bảo mật. Có ai biết một phương pháp đó là ít bộ nhớ chuyên sâu mà tôi có thể triển khai trên một máy chủ lưu trữ được chia sẻ?
EDIT:
if(/* My authorization here */) {
$path = "/uploads/";
$name = $row[0]; //This is a MySQL reference with the filename
$fullname = $path . $name; //Create filename
$fd = fopen($fullname, "rb");
if ($fd) {
$fsize = filesize($fullname);
$path_parts = pathinfo($fullname);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
break;
case "zip":
header("Content-type: application/zip");
break;
default:
header("Content-type: application/octet-stream");
break;
}
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
header("Content-length: $fsize");
header("Cache-control: private"); //use this to open files directly
while(!feof($fd)) {
$buffer = fread($fd, 1*(1024*1024));
echo $buffer;
ob_flush();
flush(); //These two flush commands seem to have helped with performance
}
}
else {
echo "Error opening file";
}
fclose($fd);
Không đồng ý điều này trùng lặp, anh chàng này đang cố gắng tải xuống qua PHP, khi câu hỏi khác chỉ là cách tải xuống tệp lớn .. các vấn đề khác nhau một cách trung thực. –